目录
- 引言
- 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,然后将栈顶元素出栈。
retf指令
- retf指令用栈中的数据,同时修改CS和IP,从而实现远转移
- cpu执行retf指令时,进行四步操作:
- call指令通常跟ret指令配合使用,CPU执行call指令,进行两步操作:
** 一,将当前的IP或 CS与IP压入栈中
** 二、转移,jmp - call指令实现原理和jmp一样,但是call指令不能实现短转移,至少是近转移或段间转移,
用法:call 标号
- call 标号,将当前的IP压栈后,转移到标号处执行指令,即如下两步操作:
- 其中跳转那一步相当于 call near ptr 标号的意思
call far ptr 标号
- call标号实现的是近转移,call far ptr 标号实现段间转移,其原理如下:
call 16位寄存器
- 本质是用16位寄存器给出了要跳转的偏移地址,即先把当前ip入栈,然后用寄存器给出的数据重新赋值ip
转移地址在内存中call指令
call word ptr 内存地址单元
- 单字16位,因此只在段内跳转,call word ptr 内存地址单元 用汇编语言解释原理类似下边:
call dword ptr 内存地址单元
- 双字32位,因此同时修改CS和IP,汇编语言解释如下:
- 乘法命令,相乘的两个数位数要相同
- mul指令的结果,如果乘数都是8位的,则结果存放在AX中,如果乘数都是16位的,则结果的高位存放在DX中,低位存放在AX中。
- mul指令格式,mul reg 或 mul 内存单元,之所以只给出一个乘数,是因为另一个乘数默认存在AL中或AX中。
- call和ret联合使用可以实现过程,即函数。通常我们将调用函数时候的参数放到一个参数寄存器中,将子函数要返回的结果放到一个结果寄存器中。
批量数据的传递
- 如果子程序只有少量参数需要传递,那么用寄存器来传递即可,但是如果由很多个参数呢?返回值也有可能很多个?在这种时候,需要将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序,对于返回值也可以用这种方法。
- 除了寄存器,内存传递参数外,还有一种通用的方法,即使用栈来传递参数。
- 不看了