鱼C论坛

 找回密码
 立即注册
查看: 2055|回复: 1

ret 和retf,请鱼友们请点!

[复制链接]
发表于 2012-7-29 14:14:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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=0caf  cs=0cb0
        ret            ;执行后 (ip)=0000, (sp)=0010, ss=0caf , cs=0cb0    (IP)=((SS)*16+(SP))   ,(SP)=(SP)+2  为什么这里(IP)=0000.

code ends

end start
;这段程序有什么用?只是用来说明ret的?还是怎么样!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 14:53:03 | 显示全部楼层
首先我们看看ret指令的原理:       对段内调用: 返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.
       对段外调用: 返回时,由堆栈弹出的第一个字为返回地址的段内偏移量,将其送入IP        中,由堆栈弹出第二个字为返回地址的段基址,将其送入CS中.


这里属于只有一个段,也就是说返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.
mov ax,0
        push ax
栈中只有这一个AX=0的值,所以POP IP后,IP=0

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Potato丶 + 5 + 5 + 3 赞一个!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-17 00:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表