一、ret 和 retf
ret 用栈中的数据,修改IP的内容,从而实现近转移;
retf 指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
CPU执行ret指令时,进行下面两步操作:
(1)(IP) = ((SS)*16+(SP))
(2)(sp) = (sp)+2
以上步骤相当于进行:
pop IP
CPU执行retf指令时,进行下面4步操作:
(1)(IP) = ((SS)*16+(SP))
(2)(sp) = (sp)+2
(3)(CS) = ((SS)*16+(SP))
(4)(sp) = (sp)+2
以上步骤相当于进行:
pop IP pop CS
二、call 指令
call 指令可以理解为高级语言中的方法(函数)调用功能。
CPU 指令 call 指令时,进行两步操作:
(1)将当前的IP或CS和IP压入栈中(保存现场)
(2)转移
call 指令不能实现短转移,除此之外,call 指令实现转移的方法和 jmp 指令的原理相同
三、依据位移进行转移的 call 指令
指令格式:
call 标号
CPU执行该指令时相当于进行:
push IP jmp near ptr 标号
四、转移的目的地址在指令中的 call 指令
指令格式:
call far ptr 标号
CPU执行该指令时相当于进行:
push CS push IP jmp far ptr 标号
五、 转移地址在寄存器中的 call 指令
指令格式:
call 16位 reg
CPU执行该指令时相当于进行:
push IP jmp 16位 reg
六、转移地址在内存中的call指令
转移地址在内存中的call指令有两种格式
(1)第一种指令格式:
call word ptr 内存单元地址
CPU 执行该指令时相当于进行:
push IP jmp word ptr 内存单元地址
(2)第二种指令格式:
call dword ptr 内存单元地址
CPU 执行该指令时相当于进行:
push CS push IP jmp dword ptr 内存单元地址
七、call 和 ret 的配合使用
call和ret的配合使用可以用来实现子程序的机制。call指令在转去执行子程序之前,会将当前指令下一条指令的位置保持在栈中,当子程序执行ret或retf指令后,会用栈中的数据设置ip或cs和ip的值,从而转到call指令后面的代码处继续执行
code segment start: mov ax,1 mov cx,3 call s mov bx,ax mov ax,4c00h int 21h ;(bx)=? s: add ax,ax loop sret code ends end start
答案是 8
八、mul 指令
(1)两个相乘的数:练歌相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认放在AX中,另一个放在16位reg或内存字单元中。
(2)结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。
MOV AX, 1234h ; 将AX寄存器置为1234h MOV CX, 5678h ; 将CX寄存器置为5678h MUL CX ; 将CX寄存器中的值与AX寄存器中的值相乘 ; 结果存储在DX:AX寄存器对中