call 和 ret 指令都是转移指令,它们都修改IP 或同时修改CS 和IP。
10.1 ret 和 retf
- ret指令用栈中的数据,修改IP的内容,从而实现近转移;
- retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
CPU 执行ret指令时,进行下面2步操作:
(1) (IP)=((ss)*16+(sp))
(2) (SP)=(SP)+2
相当于:pop IP
CPU 执行retf指令时,进行下面4步操作:
(1) (IP)=((ss)*16+(sp))
(2) (SP)=(SP)+2
(3) (CS)=((ss)*16+(sp))
(4) (SP)=(SP)+2
相当于:pop IP
pop CS
10.2 call指令
CPU执行call指令时,进行2步操作:
(1) 将当前的IP 或CS 和 IP 压入栈中;
(2) 转移。
call 指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。
10.3 依据位移进行转移的call指令
10.4 转移的目的地址在指令中的call指令
10.5 转移地址在寄存器中的call指令
10.6 转移地址在内存中的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 配合使用
利用call 和 ret 实现子程序的机制:
标号:
指令
ret
具有子程序的源程序的框架如下:
10.8 mul 指令
mul 乘法指令,使用mul做乘法注意以下2点:
(1) 2个相乘的数:2个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。
(2) 结果: 如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。
10.9 参数和结果传递问题
10.10 批量数据的传递
10.11 寄存器冲突的问题
To be continue…