第十章 CALL和RET指令
10.1 ret和retf
- ret指令用栈中的数据,修改IP,从而实现近转移,(IP)=((ss)*16+(sp)),(sp)=(sp)+2,相当于pop IP
- retf指令用栈中的数据,修改CS和IP,实现远转移,(IP)=((ss)*16+(sp)),(sp)=(sp)+2,(CS)=((ss)*16+(sp)),(sp)=(sp)+2,相当于pop IP,pop CS
10.2 call 指令
call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:
(1)将当前的 IP 或 CS和IP 压入栈中;
(2)转移(jmp)。
call指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。
10.3 依据位移进行转移的call指令
call 标号(近转移)
CPU执行此种格式的call指令时,相当于进行 push IP jmp near ptr 标号
10.4 转移的目的地址在指令中的call指令
call far ptr 标号(段间转移)
CPU执行此种格式的call指令时,相当于进行:push CS,push IP jmp far ptr 标号
10.5 转移地址在寄存器中的call指令
call 16位寄存器
CPU执行此种格式的call指令时,相当于进行: push IP jmp 16位寄存器
10.6 转移地址在内存中的call指令
call word ptr 内存单元地址
CPU执行此种格式的call指令时,相当于进行:push IP jmp word ptr 内存单元地址
mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
call word ptr ds:[0]
;执行后,(IP)=0123H,(sp)=0EH
call dword ptr 内存单元地址
CPU执行此种格式的call指令时,相当于进行:push CS push IP jmp dword ptr 内存单元地址
mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
mov word ptr ds:[2], 0
call dword ptr ds:[0]
;执行后,(CS)=0,(IP)=0123H,(sp)=0CH
10.7 call和ret的配合使用
assume cs:code
code segment
start: mov ax,1
mov cx,3
call s ;(1)CPU指令缓冲器存放call指令,IP指向下一条指令(mov bx, ax),执行call指令,IP入栈,jmp
mov bx,ax ;(4)IP重新指向这里 bx = 8
mov ax,4c00h
int 21h
s: add ax,ax
loop s;(2)循环3次ax = 8
ret;(3)return : pop IP
code ends
end start
10.8 mnul指令
两个数都是8位
一个默认放在a1里,另一个在8位寄存器或字节内存单元里,结果默认在ax里
两个数都是16位
一个默认放在ax里,另一个放在16位寄存器或内存字单元里,结果默认高位放在dx里,低位在ax