欢迎关注博主的公众号:jmdhb的平淡的睫毛膏
1.ret和retf指令
ret指令用栈中的数据,修改IP内容,从而实现近转移
retf指令用栈中数据,修改CS和IP的内容,从而实现远转移
CPU执行ret指令相当于:pop IP
CPU执行retf指令相当于:pop IP
pop CS
实例(ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令)
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push ax
mov bx,0
ret
code ends
end start
2.call指令
CPU执行call指令时,进行两步操作:
(1)将当前的IP或CS和IP入栈
(2)转移
call指令不能实现短转移,call指令实现转移的方法和jmp指令原理相同
1)依据位移进行转移的call指令
call 标号
相当于
push IP(此处的IP是下一条指令的IP)
jmp near ptr 标号
实例:
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 e8 01 00 call s
1000:6 40 inc ax
1000:7 58 s:pop ax
执行后,ax=6。
2)转移的目的地址在指令中的call指令
“call far ptr 标号 ”实现段间转移
CPU执行“call far ptr 标号”时相当于
push CS
push IP
jmp far ptr 标号
实例:
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 9A 09 00 00 10 call far ptr s
1000:8 40 inc ax
1000:9 58 s:pop ax
add ax,ax
pop bx
add ax,bx
执行后,(ax)=1010h
3)转移指令在寄存器中的call指令
call 16位reg
相当于
push IP
jmp 16位reg
实例
内存地址 机器码 汇编指令
1000:0 b8 06 00 mov ax,6
1000:3 ff d0 call ax
1000:5 40 inc ax
1000:6 mov bp,sp
add ax,[bp]
执行后,(ax)=0bh
4)转移地址在内存中的call指令
call word ptr 内存单元地址
相当于
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 内存单元地址
相当于
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