王爽汇编语言第十章——CALL和RET指令

第十章——CALL和RET指令 

1、call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。

(一)ret指令用栈中的数据,修改IP的内容,从而实现近转移。Cpu执行ret指令时,进行下面两步操作。

(1)(IP)=((SS)*16+(SP))

(2)(SP)=(SP)+2

(二)retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。Cpu执行retf指令时,进行下面的操作。

(1)(IP)=((SS)*16+(SP))

(2)(SP)=(SP)+2

(3)(CS)=((SS)*16+(SP))

(4)(SP)=(SP)+2

2、call指令经常跟ret指令配合使用,因此cpu执行call指令,进行两步操作:

(1)将当前的IP或CS和IP压入栈中。

(2)转移(jmp)

3、call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。

4、依据位移进行转移的call指令:

call  标号 (将当前的IP压栈后,转到标号处执行指令)

Cpu执行此种格式的call指令时,进行如下的操作:

(SP)=(SP)-2

((SS)*16+(SP))=(IP)

(IP)=(IP)+16位位移

16位位移=“标号”处的地址-call指令后的第一个字节的地址。

16位位移的范围为-32768~32767,用补码表示。

16位位移由编译程序在编译时算出。

5、转移的目的地址在指令中的call指令:

指令call far ptr 标号 实现的是段间转移

Cpu执行call far ptr 标号 这种格式的call指令时的操作:

(SP)=(SP)-2

((SS)*16+(SP))=(CS)

(SP)=(SP)-2

((SS)*16+(SP))=(IP)

(CS)=标号所在的段地址

(IP)=标号所在的偏移地址

6、转移地址在寄存器中的call指令:

指令格式:call 16位寄存器

功能:(SP)=(SP)-2

((SS)*16+(SP))=(IP)

(IP)=(16位寄存器)

7、转移地址在内存中的call指令有两种格式:

call word ptr 内存单元地址

call dword ptr 内存单元地址

(1)call word ptr 内存单元地址汇编语法解释:

push IP

jmp word ptr 内存单元地址

(2)call dword ptr 内存单元地址汇编语法解释:

push CS

push IP

jmp dword ptr 内存单元地址

8、mul指令:mul指令是乘法指令,使用mul做乘法的时候:

相乘的两个数,要么都是8位,要么都是16位。

8位:AL中和8位寄存器或内存字节单元中

16位:AX中和16位寄存器或内存字单元中

结果:

8位:存储在AX中

16位:存储在DX(高位)和AX(低位)中

格式如下:

mul reg

mul 内存单元

内存单元可以用不同的寻址方式给出:

mul byte ptr ds:[0]

含义为:(ax)=(al)*((ds)*16+0)

mul word ptr [bx+si+8]

含义为:

(ax)=(ax)*((dx)*16+(bx)+(si)+8)结果的低16位

(dx)=(ax)*((dx)*16+(bx)+(si)+8)结果的高16位

9、批量数据的传递:我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。

猜你喜欢

转载自blog.csdn.net/weixin_42617472/article/details/82883223