丶Haw 发表于 2012-7-29 14:14:27

ret 和retf,请鱼友们请点!

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   ;(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的?还是怎么样!

メ㊣逆ご帅☆ 发表于 2012-7-29 14:53:03

首先我们看看ret指令的原理:       对段内调用: 返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.
       对段外调用: 返回时,由堆栈弹出的第一个字为返回地址的段内偏移量,将其送入IP      中,由堆栈弹出第二个字为返回地址的段基址,将其送入CS中.


这里属于只有一个段,也就是说返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.
mov ax,0
      push ax
栈中只有这一个AX=0的值,所以POP IP后,IP=0
页: [1]
查看完整版本: ret 和retf,请鱼友们请点!