一、ret 和 retf:
1、ret 指令用栈中的数据,修改IP的内容,从而实现近转移
2、 CPU执行 ret 指令时,进行以下两步操作:
①、(IP)=((ss)16 + (sp))
②、(sp)=(sp) + 2
3、retf 指令用栈中的数据,修改 CS 和 IP 的内容,从而实现远转移
4、 CPU执行 retf 指令时,进行以下步操作:
①、(IP)=((ss)16 + (sp))
②、(sp)=(sp) + 2
③、(CS)=((ss)*16 + (sp))
④、(sp)=(sp) + 2
二、call 指令:
1、call 指令经常跟 ret 指令配合使用,因此CPU执行 call 指令,进行两步操作:
①、将当前的 IP 或 CS和IP压入栈中
②、转移(jmp)
2、call 指令不能实现短转移,除此之外,call 指令实现转移的方法和 jmp 指令的原理相同
三、依据位移进行转移的 call 指令:
1、call 标号:(将当前的IP压入栈后,转到标号处执行指令)
①、16位位移 = “标号”处的地址-call 指令后的第一个字节的地址
②、16位位移的范围-32768~32767,用补码表示
③、16位位移由编译器在编译时算出
2、 CPU执行此种格式的指令时,进行以下操作:
①、(sp)=(sp) - 2
((ss)*16 + (sp))=(IP)
②、(IP)=(IP) + 16位位移
四、转移的目的地址在指令中的 call 指令:
1、call far ptr 标号 :
①、(sp)=(sp) - 2
②、((ss)16 + (sp))=(CS)
③、(sp)=(sp) - 2
④、((ss)16 + (sp))=(IP)
2、(CS)=标号所在的段地址
(IP)=标号所在的偏移地址
3、CPU执行”call far ptr 标号”时,相当于进行:
push CS
push IP
jmp far ptr 标号
五、转移地址在寄存器中的 call 指令:
1、指令格式:call 16位寄存器
功能:
(sp)=(sp) - 2
((ss)*16 + (sp))=(IP)
(IP)=(16位寄存器)
2、汇编语法解释此种格式的指令,CPU执行 call 16位reg时,相当于进行:
push IP
jmp 16位寄存器
六、转移地址在内存中的 call 指令:
1、转移地址在内存中的 call 指令有两种格式:
②、call word ptr 内存单元地址
②、call dword ptr 内存单元地址
2、call word ptr 内存单元地址
汇编语法解释:
push IP
jmp word ptr 内存单元地址
3、call dword ptr 内存单元地址
汇编语法解释:
push CS
jmp dword ptr 内存单元地址
七、call 和 ret 的配合使用:
assume cs:code
code segment
start:mov ax,1
mov cx,3
call s
mov bx,ax
mov ax,4c00H
int 21H
s:add ax,ax
loop s
ret
code ends
end start
八、mul 指令:
1、mul是乘法指令,使用 mul 指令时,需注意以下:
①、相乘的两个数,要么都是8位,要么都是16位
8位:AL中和8位寄存器或内存字节单元中
16位:AX中和16位寄存器或内存字单元中
②、结果:
8位:AX中
16位:DX(高位) 和 AX(低位)中
2、格式:
mul reg
mul 内存单元
3、内存单元可以用不同的方式给出:
①、mul byte ptr ds:[0]
含义:(ax)=(al)((ds)16 + 0)
②、mul word ptr [bx + si + 8]
含义:
(ax)=(ax)((ds)16 + (bx) + (si) + 8)结果的低16位
(dx)=(ax)((ds)16 + (bx) + (si) + 8)结果的高16位