CALL和RET指令
call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。
ret和retf
ret指令用栈中的数据,修改IP的内容,从而实现近转移。
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
CPU执行ret指令时,相当于进行下面的操作:
pop ip
CPU执行retf指令时相当于进行下面的操作:
pop ip
pop cs
call指令
cpu执行call指令时,进行两部操作:
- 将当前的IP或CS和IP压入栈中;
- 转移
依据位移进行转移的call指令
call 标记(将当前的ip压入栈后,转到标记处执行指令)
CPU执行call 标号时相当于进行:
push ip;
jmp near ptr 标号
转移的目的地址在指令中的call指令
call far ptr 标号实现的是段间转移
CPU执行call far ptr标号时,相当于进行
push cs
push ip
jmp far ptr 标号
转移地址在寄存器中的call指令
指令格式: call 16位 reg
执行call 16位reg时cpu相当于进行:
push ip
jmp 16位reg
转移地址在内存中的call指令
转移地址在内存中的call指令有两种格式。
- call word ptr内存单元地址
CPU执行“call word ptr 内存单元地址”时相当于进行:
push ip
jmp word ptr 内存单元地址。 - call dword ptr 内存单元地址
push cs
push ip
jmp dword ptr 内存单元地址
内存单元低字节的是修改后的ip,高位字节是修改后的cs。
call 和 ret的配合使用
我们已经学习了rfet和call指令的原理了,我们可以用call 和ret配合使用。
子程序的框架如下:
标记:
~~~~
指令
~~~~
ret
具有子程序的源程序的框架如下:
assume cs:code
code segment
main:
:
call subl
:
:
mov ax,4c00h
int 21h
sub1: :
:
call sub2
:
:
ret
sub2 : :
:
:
ret
code ends
end main
mul 指令
mul指令是乘法指令,使用mul做乘法时候需要注意以下两点
1 两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字单元中;如果是16位,一个默认在AX中,领一个放在16位reg或内存字单元中。
2 结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中放。