zoukankan      html  css  js  c++  java
  • 汇编语言——call 和 ret 指令

     

    一、ret 和 retf

    我们用汇编语法来解释ret和retf指令,则:

    CPU执行ret指令时,相当于进行:

    • pop IP

    CPU执行retf指令时,相当于进行:

    • pop IP(一般IP都是在低位地址的)
    • pop CS(CS在高位地址)

    二、call指令

    CPU执行call指令,进行两步操作:

    (1)将当前的 IP 或 CS和IP 压入栈中;

    (2)转移。

    call 指令不能实现段内短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同,下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式。

    段内转移

    指令格式:call 标号

    CPU执行上面指令相当于进行:

    push IP

    jmp near ptr 标号

    段间转移

    指令格式:call far ptr 标号

    CPU 执行上面指令时,相当于进行:

    push CS

    push IP

    jmp far ptr 标号

    转移地址在寄存器中的call指令

    指令样式:call 16位寄存器

    CPU执行以上指令时,相当于进行:

    push IP

    jmp 16位寄存器

    转移地址在内存中的call指令

    (1) call word ptr 内存单元地址

    汇编语法解释:

    push IP

    jmp word ptr 内存单元地址

    (2) call dword ptr 内存单元地址

    汇编语法解释:

    push CS

    push IP

    jmp dword ptr 内存单元地址

    mul指令

    mul是乘法指令,使用 mul 做乘法的时候:

    (1)相乘的两个数:要么都是8位,要么都是16位。

      8 位: AL中和 8位寄存器或内存字节单元中;

    16 位: AX中和 16 位寄存器或内存字单元中。

    使用mul座乘法的时候:

    (2)结果

      8位:AX中;

    16位:DX(高位)和AX(低位)中。

    (3)指令样式

    mul reg

    mul 内存单元

    (4)内存单元可以用不同的寻址方式给出

    mul byte ptr ds:[0]

    含义为: (ax)=(al)*((ds)*16+0);

    mul word ptr [bx+si+8]

    含义为:

    (ax)=(ax)*((ds)*16+(bx)+(si)+8)结果的低16位;

    (dx)=(ax)*((ds)*16+(bx)+(si)+8)结果的高16位;

    示例:计算100*10000

    100小于255,可10000大于255,所以必须做16位乘法,程序如下:

    mov ax,100

    mov bx,10000

    mul bx

    结果: (ax)=4240H,(dx)=000FH(F4240H=1000000)

    方法一:

    方法二:一直jmp,等到cx的值为0的时候使用jcxz跳出循环(好处,不用我们设置cx的大小了)

    方法三:寄存器是有限的,so我们可以使用栈来存放数据

     1 capital: push cx
     2          push si
     3          
     4  change: mov cl,[si]
     5          mov ch,0
     6          jcxz ok
     7          and byte ptr [si],11011111b
     8          inc si
     9          jmp short change
    10          
    11      ok: pop si
    12          pop cx
    13          ret
  • 相关阅读:
    随机小错2_0527
    随计小错
    C++实现读写文件
    03-树2 List Leaves (25 分)
    获取毫秒级的时间戳
    new对象时,类名后加括号与不加括号的区别
    FoxMail 7.2的邮件存储目录修改
    C/C++ 开源算法库
    VS2015的安装
    脏内存导致BUG的问题
  • 原文地址:https://www.cnblogs.com/x54256/p/8098832.html
Copyright © 2011-2022 走看看