王爽《汇编语言》第三版 第十章 call和ret指令

时间:2021-03-26 00:41:45

引言

  call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现自程序的设计。

 

10.1 ret 和 retf

  ret指令用栈中的数据,修改IP的内容,从而实现近转移!
  CPU执行ret指令时,进行下面两步操作:
  1.(IP)=((ss)*16+(sp))
  2.(sp)=(sp)+2

  retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;
  CPU执行retf指令时,进行下面两步操作:
  1.(IP)=((ss)*16+(sp))
  2.(sp)=(sp)+2
  3.(CS)=((ss)*16+(sp))
  4.(sp)=(sp)+2

  CPU执行ret指令时,相当于进行:
    pop IP
  CPU执行retf指令时,相当于进行:
    pop IP
    pop CS


10.2 call 指令

  call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:
  1.将当前的 IP 或 CS和IP 压入栈中
  2.转移(jmp)

10.3 依据位移进行转移的call指令

  call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。
  call 标号(将当前的 IP 压栈后,转到标号处执行指令)
  CPU 执行指令“call 标号”时,相当于进行:
    push IP
    jmp near ptr 标号


10.4 转移的目的地址在指令中的call指令

  call far ptr 标号(实现的是段间转移)
  CPU 执行指令 “call far ptr 标号” 时,相当于进行:
    push CS
    push IP
    jmp far ptr 标号


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

  call 16位寄存器
  CPU执行指令“call 16位寄存器”时,相当于进行:
    push IP
    jmp 16位寄存器


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

  转移地址在内存中的call指令有两种格式:

  1.call word ptr 内存单元地址:

    push IP
    jmp word ptr 内存单元地址

  2.call dword ptr 内存单元地址:

    push CS
    push IP
    jmp dword ptr 内存单元地址


10.7 call 和 ret 的配合使用


10.8 mul 指令

mul是乘法指令。
  相乘的两个数:要么都是8位,要么都是16位。
  1.8 位: 乘数位于AL中和 8位寄存器或内存字节单元中,结果位于AX中;
  2.16 位: 乘数位于AX中和 16 位寄存器或内存字单元中,结果位于DX(高位)和AX(低位)中。

  内存单元可以用不同的寻址方式给出,比如:
    mul byte ptr ds:[0]
    含义为: (ax)=(al)*((ds)*16+0);

    mul word ptr [bx+si+8]
    含义为:
      (ax)=(al)*((ds)*16+(bx)+(si)+8)结果的低16位;
      (dx)=(al)*((ds)*16+(bx)+(si)+8)结果的高16位;


10.9 模块化程序设计


10.10 参数和结果传递的问题


10.11 批量数据的传递


10.12 寄存器冲突的问题

 

参考资料:《小甲鱼汇编零基础入门》

 

     《汇编语言》第三版