第十章 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压入栈中。

②转移。

扫描二维码关注公众号,回复: 4503956 查看本文章

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指令中的"专用"等。因此,在子程序和主程序中可能会出现寄存器使用冲突的问题,造成程序执行有误。

猜你喜欢

转载自www.cnblogs.com/Yangruzhang/p/10117576.html
今日推荐