zoukankan      html  css  js  c++  java
  • 汇编第五日

    mov ax, offset 标号:取得标号相对于伪代码后第一条指令地址0的相对偏移量即标号地址

    可以发现汇编指令中的idata会直接反映在机器码中

    jmp指令可以修改IP或CS和IP的值,具体格式如下:

    ①jmp short 标号段内转移

    (IP) = (IP)+ 8位位移

    8位位移含义是:标号地址减去jmp指令的下一条指令地址即为相对位移地址(可正可负,但是范围必须在8位数据能表示之内并不是直接目的地址

    8位位移范围为-128 - 127

    例如:

     

    JMP 0008即跳到0BBD:0008位置,但是机器码中却没有反映0008,那是因为将JMP指令放入指令缓冲区中后,IP会自增JMP指令的大小2字节,此时IP为0005,0005跳到0008还需要0003(相对位移),所以机器码中反映了03

    ②jmp near ptr 标号2^16 = 64KB 刚好为一个段最大值所以用于段内转移

    (IP) = (IP) + 16位位移

    16位位移范围:-2^15 - (2^15)-1

    jmp far ptr 标号2 ^ 32 > 64KB,段间转移

    (IP) = (IP) + 32位位移

    机器码中却反映了目的地址,不为相对位移地址

    jmp reg(段内转移)

    reg为16位:(IP) = (reg)

    jmp word ptr 内存单元(段内转移)

    (IP) = (内存单元)

    jmp dword ptr 内存单元(段间转移)

    (IP) = (低双字)

    (CS) = (高双字)

    jcxz 标号

    有条件转移,与cx寄存器内容有关

    cx = 0 跳转到标号位置执行

    cx!=0 不跳转

    (IP) = (IP) + 8位位移

    loop指令执行过程

    1.cx--

    2.cx = 0跳转到标号,反之

    (IP) = (IP) + 8位位移

    总结除了jmp far ptr,其余改变IP的都是给出相对位移地址

    nop指令:空指令  占1字节

     ret指令:

    用栈顶数据修改IP值

     执行过程:

    (IP) = ((SS) * 16 + (SP))

      (SP) = (SP) + 2                     ;两步相当于pop ip

     

    retf指令:

    用栈顶数据修改IP和CS

    执行过程:

    (IP) = ((SS) * 16 + (SP))

      (SP) = (SP) + 2      两步相当于pop ip

    (CS) = ((SS) * 16 + (SP))

      (SP) = (SP) + 2      ;两步相当于pop cs

    call指令:

    ①将IP或CS和IP压栈(SP) = (SP) -2; ((SS) * 16 + (SP)) = (IP)

    jmp near ptr 标号(机器码中表现的是相对位移地址),即(IP) = (IP) + 16位位移

    call far ptr 标号:

    (SP) = (SP) - 2

    ((SS) * 16 + (SP)) = (CS);两步相当于push cs

    (SP) = (SP) - 2

    ((SS) * 16 + (SP)) = (IP);两步相当于push ip

    (CS) = 标号对应的段地址

    (IP) = 标号对应的偏移地址;两步相当于jmp far ptr 标号

    call reg(段内转移):

    ①push IP

    ②jmp reg  即(IP) = (reg)

    call word ptr 内存单元:

    ①push IP

    ②jmp word ptr 内存单元

    call dword ptr 内存单元:

    ①push cs(低16位)

    ②push ip(高16位)

    ③jmp dword ptr 内存单元

    call和ret配合使用相当于调用一个子程序(相当于高级语言中的调用函数

    mul 16位reg或内存单元:

    相乘两个数要么都是8位,要么16位

    ①mov byte ptr ds:[0]

    byte指明数据为8位:

    (ax) = (al) * ((ds)*16+0)

    ②mov word ptr ds:[0]

    word指明数据为16位:

    (ax) = (ax) * ((ds)*16+0)低16位

    (ax) = (ax) * ((ds)*16+0)高16位

    对于调用子程序传参问题:

    参数少可以用寄存器解决

    参数多的话,将参数放入内存空间中,再将其首地址传过去

    通用寄存器都可以化成h和l

    Done!!!

  • 相关阅读:
    yii框架开启事务
    CI框架--事务
    Nginx负载均衡使用ip
    如果nginx启动失败,错误解决
    nginx使用ssl模块配置支持HTTPS访问【解决ssl错误】
    Nginx反向代理+负载均衡简单实现(https方式)
    nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37
    openssl生成ssl证书
    POJ 1955 Rubik's Cube
    CF卡技术详解——笔记
  • 原文地址:https://www.cnblogs.com/chaunceyctx/p/7287748.html
Copyright © 2011-2022 走看看