|
主题 : : 又是关于debug的问题 [已解决] |
回复[ 6次 ]
点击[ 1203次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-10-29 10:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16 |
王爽老师在其教材中说:出栈后,SS:SP指向新的栈顶。POP操作前的栈顶元素依然存在,但是,它已经不在栈中,当再次执行PUSH等入栈指令后,新的指令将其覆盖。
可是在做实验2第一题的时候,我发现一个问题:
题目:(1) 使用Debug,将上面的程序段写如内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax, ffff
mov ds, ax
mov ax, 2200
mov ss, ax
mov sp, 0100
mov ax, [0] ; ax = ( E8EAH )
add ax, [2] ; ax = ( E9E9H )
mov bx, [4] ; bx = ( 30F0H )
add bx, [6] ; bx = ( 6021H )
push ax ; sp = (00FEH);修改的内存单元的地址是(2200:00FE),内容是(①)
push bx ; sp = (00FCH);修改的内存单元的地址是(2200:00FC),内容是(②)
pop ax ; sp = ( 00FEH ); ax = ( 6021H )
pop bx ; sp = ( 0100H ); bx = ( E9E9H )
push [4] ; sp = ( 00FEH );修改的内存单元的地址是(2200:00FE),内容是(③)
push [6]; sp =(00FCH);修改的内存单元的地址是(2200:00FC),内容是(④)
问题:在回答(①)问题时,到底是写修改前还是修改后的内容呢?如果是写修改后的内容,那很简单,就是ax的值;如果是写修改前的内容,那就需要查找执行指令push ax 前2200:00FE处的内容,我预先查看了,是0556H。(如下图)
问题(①)还容易写出来,可是在回答(②)时,我迷惑了,根据第一次“D SS:00F0 L 10”指令显示的情况来看,2200:00FC处的初始值应该为0AF2H,可是执行指令push ax之后,2200:00FC处的值变成了0556H,这究竟是怎么回事呢?
接下来继续执行指令,我发现每执行一个入栈指令,0AF2H就向左移动;而执行出栈指令后,0AF2H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!
附:下面是debug过程中的一些截图:
DS:00- DS:0F处的内存单元内容如下:
-d ds:0 f
FFFF:0000 EA E8 FF 00 F0 30 31 2F-32 36 2F 30 35 00 FC 21 .....01/26/05..!
SS:00F0- SS:0100处的内存单元内容如下:
-D SS:00F0 L 10;执行指令push ax之前
2200:00F0 00 00 00 00 00 00 00 22-00 00 0D 01 F2 0A 56 05 ......."......V
- .
-D SS:00F0 L 10;执行指令push ax之后,ax = E9E9H
2200:00F0 00 00 00 00 E9 E9 00 00-1D 01 F2 0A 56 05 E9 E9 ............V...
-
-D SS:00F0 L 10;执行指令push bx之后,bx = 6021H
2200:00F0 00 00 E9 E9 00 00 1E 01-F2 0A 56 05 21 60 E9 E9 ..........V.!`..
-
-D SS:00F0 L 10;执行指令pop ax之后,ax = 6021H
2200:00F0 00 00 E9 E9 21 60 00 00-1F 01 F2 0A 56 05 E9 E9 ....!`......V...
-
-D SS:00F0 L 10;执行指令pop bx之后,bx = E9E9H
2200:00F0 00 00 E9 E9 21 60 21 60-00 00 20 01 F2 0A 56 05 ....!`!`.. ...V.
-
-D SS:00F0 L 10;执行指令push [4]之后,DS:4 = 30F0H
2200:00F0 00 00 E9 E9 21 60 00 00-24 01 F2 0A 56 05 F0 30 ....!`..$...V..0
-
-D SS:00F0 L 10;执行指令push [6]之后,DS:6 = 2F31H
2200:00F0 00 00 21 60 00 00 28 01-F2 0A 56 05 31 2F F0 30 ..!`..(...V.1/.0
- . | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-10-29 10:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16 |
修改:“接下来继续执行指令,我发现每执行一个入栈指令,0AF2H就向左移动;而执行出栈指令后,0AF2H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!”改为
“接下来继续执行指令,我发现每执行一个入栈指令,0556H就向左移动;而执行出栈指令后,0556H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!”。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2007-10-29 13:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06 |
1.修改后的内存单元的内容,填修改前的内存单元的内容是没什么意义的。
2.因为在debug下输入一次命令就发生一次中断,要想让你的程序正确执行,就要保存现场,需要保存当前的cs,ip等的值,所以栈中的变化是由于debug本身使用栈导致的。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2007-10-29 13:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:31
信誉值:1
注册日期:2007-06-26 11:44 |
到底是写修改前还是修改后的内容呢?
题目要求是:根据指令执行后的实际情况运行情况填空,所以是填写修改后的内容。
数据0556H会因为push和pop的响应动作而发生相应的移动,但你总结其规律会发现一直都是在栈顶的前一个元素。这个情况结合p70的实验任务(2),楼主再考虑考虑。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-10-29 13:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16 |
TO playboy:
因为用T指令进行调试时,会产生中断。而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。
我知道0AF2H和011D是当前CS和IP的值,那0556H又表示什么,是中断的标志吗? | | |
|
|
|
|
[第5楼]
[ 回复时间:2007-10-29 13:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16 |
哦,已经知道了0556H就是标志寄存器的值。
谢谢各位的回答! | | |
|
|
|
|
[第6楼]
[ 回复时间:2007-11-01 07:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16 |
此贴由 贴主 于 [ 2007-11-01 07:32 ] 结贴。 结贴原因:问题已解决 | | |