压寨宝宝 发表于 2013-1-19 17:10:04

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

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



初学汇编。王爽教材第四章的课后习题。貌似不是第二版的= =
      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:2000Hsp: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

请求各位大神帮忙解释!!谢谢!!!







小甲鱼 发表于 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=2000BX=0000CX=0015DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1423ES=1423SS=1433CS=1433IP=0003   NV UP EI PL NZ NA PO NC
1433:0003 8ED0          MOV   SS,AX
-t

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


-t

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

牡丹花下死做鬼 发表于 2013-1-19 21:02:16

诶我汇编 没怎么 学   还得 好好学学汇编啊

压寨宝宝 发表于 2013-1-20 09:48:09

小甲鱼 发表于 2013-1-19 18:51 static/image/common/back.gif
转的:

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


噢!!soga 。。嘿嘿。明白 了个大概,还没学到中断的。不过也算是有个了解了!!谢谢甲鱼兄。视频给力!继续支持。继续学习!!!~~~~~

翠竹 发表于 2013-1-20 11:13:02

又见鱼哥亲自操刀,我就来打个酱油吧
页: [1]
查看完整版本: 汇编第四章课后练习。出错了~~各位帮帮呀~~~