实验九

一、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格式:

实验九_第1张图片

实验九_第2张图片

七、call和ret的配合使用(例题)

 实验九_第3张图片

实验九_第4张图片

实验九_第5张图片

实验九_第6张图片

八、mul指令

①两个数相乘:两个相乘的数必须都是8位或者都是16位。都是8位时:一个默认放在AL中,另一个放在8位reg或者内存字节单元;都是16位时:一个放在AX中,另一个放在16位reg或内存子单元中。

②结果:都是8位时:默认放在AX中;都是16位时:高位默认放在DX中存放,低位放在AX中。

实验九_第7张图片

九、模块化程序设计(略)

十、参数和结果传递的问题(例题)

 实验九_第8张图片

实验九_第9张图片

实验九_第10张图片

十一、批量数据的传送(例题)

 实验九_第11张图片

实验九_第12张图片

实验九_第13张图片

十二、寄存器冲突的问题

寄存器用作参数传递时,由于寄存器个数有限,且有些寄存器在指令中有特殊用途,如cx在loop和jcxz指令中的"专用",al, ah, ax, dx在mul指令和div指令中的"专用"等。因此,在子程序和主程序中可能会出现寄存器使用冲突的问题,造成程序执行有误。

你可能感兴趣的:(实验九)