第十章——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、批量数据的传递:我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。