目录

  • 引言
  • ret和retf指令
  • ret指令
  • retf指令
  • call指令
  • 用法:call 标号
  • call far ptr 标号
  • call 16位寄存器
  • 转移地址在内存中call指令
  • call word ptr 内存地址单元
  • call dword ptr 内存地址单元
  • mul指令
  • call与ret联合使用
  • 批量数据的传递
  • 寄存器冲突的问题

引言

  • call和ret都是转移指令,它们都修改IP,或者同时修改CS和IP

ret和retf指令

  • ret和retf都是利用栈中数据来重新填充IP(CS)。

ret指令

  • ret指令利用栈中的内容,修改IP的内容,从而实现近转移
  • cpu执行ret指令时,进行两步操作,即先用栈顶的数据来修改IP,然后将栈顶元素出栈。
  • les 指令_IP


retf指令

  • retf指令用栈中的数据,同时修改CS和IP,从而实现远转移
  • cpu执行retf指令时,进行四步操作:
  • les 指令_les 指令_02


call指令
  • call指令通常跟ret指令配合使用,CPU执行call指令,进行两步操作:
    ** 一,将当前的IP或 CS与IP压入栈中
    ** 二、转移,jmp
  • call指令实现原理和jmp一样,但是call指令不能实现短转移,至少是近转移或段间转移,

用法:call 标号

  • call 标号,将当前的IP压栈后,转移到标号处执行指令,即如下两步操作:
  • les 指令_IP_03


  • 其中跳转那一步相当于 call near ptr 标号的意思

call far ptr 标号

  • call标号实现的是近转移,call far ptr 标号实现段间转移,其原理如下:
  • les 指令_数据_04


call 16位寄存器

  • 本质是用16位寄存器给出了要跳转的偏移地址,即先把当前ip入栈,然后用寄存器给出的数据重新赋值ip
  • les 指令_寄存器_05


转移地址在内存中call指令

call word ptr 内存地址单元

  • 单字16位,因此只在段内跳转,call word ptr 内存地址单元 用汇编语言解释原理类似下边:
  • les 指令_数据_06


call dword ptr 内存地址单元

  • 双字32位,因此同时修改CS和IP,汇编语言解释如下:
  • les 指令_IP_07


mul指令
  • 乘法命令,相乘的两个数位数要相同
  • les 指令_les 指令_08


  • mul指令的结果,如果乘数都是8位的,则结果存放在AX中,如果乘数都是16位的,则结果的高位存放在DX中,低位存放在AX中。
  • mul指令格式,mul reg 或 mul 内存单元,之所以只给出一个乘数,是因为另一个乘数默认存在AL中或AX中。
call与ret联合使用
  • call和ret联合使用可以实现过程,即函数。通常我们将调用函数时候的参数放到一个参数寄存器中,将子函数要返回的结果放到一个结果寄存器中。
  • les 指令_寄存器_09


批量数据的传递

  • 如果子程序只有少量参数需要传递,那么用寄存器来传递即可,但是如果由很多个参数呢?返回值也有可能很多个?在这种时候,需要将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序,对于返回值也可以用这种方法。
  • 除了寄存器,内存传递参数外,还有一种通用的方法,即使用栈来传递参数。
寄存器冲突的问题
  • 不看了