ret 和retf,请鱼友们请点!
assume cs:codestack 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 ;(ip)=0014 (sp)=000e ss=0cafcs=0cb0
ret ;执行后 (ip)=0000, (sp)=0010, ss=0caf , cs=0cb0 (IP)=((SS)*16+(SP)) ,(SP)=(SP)+2为什么这里(IP)=0000.
code ends
end start
;这段程序有什么用?只是用来说明ret的?还是怎么样! 首先我们看看ret指令的原理: 对段内调用: 返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.
对段外调用: 返回时,由堆栈弹出的第一个字为返回地址的段内偏移量,将其送入IP 中,由堆栈弹出第二个字为返回地址的段基址,将其送入CS中.
这里属于只有一个段,也就是说返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.
mov ax,0
push ax
栈中只有这一个AX=0的值,所以POP IP后,IP=0
页:
[1]