ret指令用栈中的数据,修改ip的内容,从而实现近转移
retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移
cpu在执行ret指令时,进行下面两步操作
(ip) = ((ss)*16 +(sp)
(sp) = (sp)+2
使用汇编语言表示就是
pop 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 cs
push ax
mov bx,0
retf
code ends
end start
cpu在执行retf指令时,进行下面两步操作
(ip) = ((ss)*16 +(sp)
(sp) = (sp)+2
(cs) = ((ss)*16 +(sp)
(sp) = (sp)+2
使用汇编语言表示就是
pop ip
pop cs
call指令
cpu执行call指令时,进行下面两步操作
将当前的ip或者cs和ip压入栈中
转移
1) call 标识,
(sp) = (sp) -2
((ss)*16 +(sp)) = (ip)
(ip) = (ip) + 16位位移
使用汇表示位
push ip
jmp near ptr 标识
2) call far ptr 标识;实现段间转移
(sp) = (sp) -2
((ss)*16 +(sp)) = (cs)
(sp) = (sp) -2
((ss)*16 +(sp)) = (ip)
(cs) = 标识所在段的地址
(ip) = 标识所在段中的偏移地址
使用汇编表示为
push cs
push ip
jmp far ptr 标识
3)call 16位reg
(sp) = (sp) - 2
((ss)*16 +(sp)) = (ip)
(ip) = (16位reg)
汇编表示:
push ip
jmp 16位reg
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