鱼C论坛

 找回密码
 立即注册
查看: 1782|回复: 4

汇编第四章课后练习。出错了~~各位帮帮呀~~~

[复制链接]
发表于 2013-1-19 17:10:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 压寨宝宝 于 2013-1-19 17:20 编辑

11.jpg

初学汇编。王爽教材第四章的课后习题。貌似不是第二版的= =
        mov ax,2000H        
        mov ss,ax
        mov sp,0
        add sp,4
        pop ax(问题出在这里)
        pop bx
        push ax
        push bx
        pop ax
        pop bx

单步运行的时候,运到第一个pop就弹出“NTVDM CPU 遇到无效指令  CS:0600 IP:ff35 op:f0 00 e6 00 00”
其中它要pop的位置ss:2000H  sp:4H 之后的值都是0的。怎么会错误了呢?
    第二版中的add改成10 就可以正常单步调试到结束了。为什么呢?那几块内存有什么特殊的吗?
        mov ax,2000H        
        mov ss,ax
        mov sp,0
        add sp,10(只修改这里)
        pop ax
        pop bx
        push ax
        push bx
        pop ax
        pop bx
22.jpg
请求各位大神帮忙解释!!谢谢!!!







12.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-19 18:51:01 | 显示全部楼层
转的:

溢出产生的错误 (所以第二版把add sp,4  改成了 add sp,10)

通过调试我发现把add sp,4这句中的4改成6或比6大程序就可以正常运行。这是怎么回事呢。原因是当我们用debug调试程序的时候执行完一句debug会产生中断,并把当前寄存器IP、CS和flags中的数据压入栈,待执行下一条语句的时候从中恢复。当我们执行add sp,4的时候,由于离栈顶0只剩下4个字节的空间即0~3 而当我们用debug调试程序的时候执行完一句debug会产生中断,并把当前寄存器IP、CS和flags中的数据压入栈,需要6个字节空间,所以就产生溢出了,待执行下一条语句pop bx的时候,debug要恢复寄存器中的数据的时候就出错了,因为保存值溢出了。所以栈顶要保留至少6个字节空间就不会出错了。

调试过程如下:
-------------------------------------

D:\ASM>debug t1.exe
-t

AX=2000  BX=0000  CX=0015  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=1423  ES=1423  SS=1433  CS=1433  IP=0003   NV UP EI PL NZ NA PO NC
1433:0003 8ED0          MOV     SS,AX
-t

AX=2000  BX=0000  CX=0015  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=1423  ES=1423  SS=2000  CS=1433  IP=0008   NV UP EI PL NZ NA PO NC
1433:0008 83C404        ADD     SP,+04
-d 2000:0
2000:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................   
2000:0010  1B D1 E3 D1 D2 8B CB 8B-FA D1 E3 D1 D2 D1 E3 D1   ................
2000:0020  D2 03 D9 13 D7 03 D8 83-D2 00 EB DC 93 9D 75 07   ..............u.
2000:0030  F7 D8 83 D2 00 F7 DA 5F-5E 8B E5 5D CB 56 33 F6   ......._^..].V3.
2000:0040  B9 36 00 32 E4 FC AC 32-E0 E2 FB 80 F4 55 74 09   .6.2...2.....Ut.
2000:0050  B8 01 00 50 9A C9 0C B4-1E 5E CB B8 02 00 E9 90   ...P.....^......
2000:0060  F5 55 8B EC 56 57 1E FC-1E 07 8B 4E 08 41 80 E1   .U..VW.....N.A..
2000:0070  FE 8B 7E 06 33 DB 8C D8-8C D2 3B C2 75 03 BB 82   ..~.3.....;.u...
-
//我们看到这时2000:0~2000:f这段内存空间是空的;继续执行:


-t

AX=2000  BX=0000  CX=0015  DX=0000  SP=0004  BP=0000  SI=0000  DI=0000
DS=1423  ES=1423  SS=2000  CS=1433  IP=000B   NV UP EI PL NZ NA PO NC
1433:000B 5B            POP     BX
-d 2000:0
2000:0000  33 14 1D 0E 00 00 00 00-00 00 00 00 00 00 00 00   3...............
2000:0010  1B D1 E3 D1 D2 8B CB 8B-FA D1 E3 D1 D2 D1 E3 D1   ................
2000:0020  D2 03 D9 13 D7 03 D8 83-D2 00 EB DC 93 9D 75 07   ..............u.
2000:0030  F7 D8 83 D2 00 F7 DA 5F-5E 8B E5 5D CB 56 33 F6   ......._^..].V3.
2000:0040  B9 36 00 32 E4 FC AC 32-E0 E2 FB 80 F4 55 74 09   .6.2...2.....Ut.
2000:0050  B8 01 00 50 9A C9 0C B4-1E 5E CB B8 02 00 E9 90   ...P.....^......
2000:0060  F5 55 8B EC 56 57 1E FC-1E 07 8B 4E 08 41 80 E1   .U..VW.....N.A..
2000:0070  FE 8B 7E 06 33 DB 8C D8-8C D2 3B C2 75 03 BB 82   ..~.3.....;.u...

当我们执行完 add sp,4 我们发现2000:0~2000:3 这段内存空间的数据有改变,其实这就是debug中断时压出栈中的数据,分别是flags cs ip 由于我们把sp的值设置为4栈顶空间只有四个内存单元所以只看到了flags寄存器的值0E1DH 和CS的值1433H 而IP的值哪里去了 溢出了..

-d 2000:fff0
2000:FFF0  00 00 00 00 00 00 00 20-00 00 00 20 00 00 0B 00
-
IP的值跑这里去了。 2000:fffe~2000:ffff 也就是000B

所以下执行下一句程序的时候 debug不能正确恢复cs ip flags中的值 所以程序出错。!

评分

参与人数 1鱼币 +2 收起 理由
s0512 + 2 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-19 21:02:16 | 显示全部楼层
诶  我汇编 没怎么 学   还得 好好学学汇编啊  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-20 09:48:09 | 显示全部楼层

噢!!soga 。。嘿嘿。明白 了个大概,还没学到中断的。不过也算是有个了解了!!谢谢甲鱼兄。视频给力!继续支持。继续学习!!!~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-20 11:13:02 | 显示全部楼层
又见鱼哥亲自操刀,我就来打个酱油吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-3-29 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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