第十章 CALL和RET指令
一、ret和retf
①ret:用栈中的数据修改IP的值,从而实现近转移。
ret指令的两步操作:
(IP)=((SS)*16+(SP));(SP)=(SP)+2。
②retf:用栈中的数据修改CS和IP的值,从而实现远转移。
retf指令的四步操作:
(IP)=((SS)*16+(SP));(SP)=(SP)+2;(CS)=((SS)*16+(SP));(SP)=(SP)+2。
二、call指令
两步操作:
①将当前的IP或CS和IP压入栈中。
②转移。
call指令不能实现短转移。
三、依据位移进行转移的call指令
call 标号(将当前的IP压栈后,转移到标号处执行指令)(段内近转移)
两步操作:(SP)=(SP)-2 ((SS)*16+(SP))=(IP);(IP)=(IP)+16位位移。
call 标号=push IP
jump near ptr 标号
四、转移的目的地址在指令中的call指令
call far ptr 标号(将当前的CS和IP压栈后,转移到标号处执行指令)(段间转移)
四步操作:(SP)=(SP)-2 ;((SS)*16+(SP))=(CS);(SP)=(SP)-2 ;((SS)*16+(SP))=(IP)
call far ptr 标号=push CS
push IP
jmp far ptr 标号
五、转移地址在寄存器中的call指令
call 16 位reg(16位寄存器)
两步操作:(SP)=(SP)-2;((SS)*16+(SP))=(IP)=(16位reg)
call 16位reg=push IP
jmp 16位reg
六、转移地址在内存中的call指令
①call word ptr 内存单元地址
call word ptr 内存单元地址=push IP
jmp word ptr 内存单元地址
②call dword ptr 内存单元地址
call dword ptr 内存单元地址=push CS
push IP
jmp dword ptr 内存单元地址
总结call格式:
七、call和ret的配合使用(例题)
八、mul指令
①两个数相乘:两个相乘的数必须都是8位或者都是16位。都是8位时:一个默认放在AL中,另一个放在8位reg或者内存字节单元;都是16位时:一个放在AX中,另一个放在16位reg或内存子单元中。
②结果:都是8位时:默认放在AX中;都是16位时:高位默认放在DX中存放,低位放在AX中。
九、模块化程序设计(略)
十、参数和结果传递的问题(例题)
十一、批量数据的传送(例题)
十二、寄存器冲突的问题
寄存器用作参数传递时,由于寄存器个数有限,且有些寄存器在指令中有特殊用途,如cx在loop和jcxz指令中的"专用",al, ah, ax, dx在mul指令和div指令中的"专用"等。因此,在子程序和主程序中可能会出现寄存器使用冲突的问题,造成程序执行有误。