. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  又是关于debug的问题  [已解决] 回复[ 6次 ]   点击[ 1203次 ]  
goal00001111
[帖 主]   [ 发表时间: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
-                                             .
goal00001111
[第1楼]   [ 回复时间:2007-10-29 10:24 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16
修改:“接下来继续执行指令,我发现每执行一个入栈指令,0AF2H就向左移动;而执行出栈指令后,0AF2H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!”改为
“接下来继续执行指令,我发现每执行一个入栈指令,0556H就向左移动;而执行出栈指令后,0556H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!”。
happy
[第2楼]   [ 回复时间:2007-10-29 13:24 ]   [引用]   [回复]   [ top ] 
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06
1.修改后的内存单元的内容,填修改前的内存单元的内容是没什么意义的。
2.因为在debug下输入一次命令就发生一次中断,要想让你的程序正确执行,就要保存现场,需要保存当前的cs,ip等的值,所以栈中的变化是由于debug本身使用栈导致的。
playboy
[第3楼]   [ 回复时间:2007-10-29 13:28 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:1
注册日期:2007-06-26 11:44
到底是写修改前还是修改后的内容呢?

题目要求是:根据指令执行后的实际情况运行情况填空,所以是填写修改后的内容。

数据0556H会因为push和pop的响应动作而发生相应的移动,但你总结其规律会发现一直都是在栈顶的前一个元素。这个情况结合p70的实验任务(2),楼主再考虑考虑。
goal00001111
[第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又表示什么,是中断的标志吗?
goal00001111
[第5楼]   [ 回复时间:2007-10-29 13:51 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16
哦,已经知道了0556H就是标志寄存器的值。
谢谢各位的回答!
goal00001111
[第6楼]   [ 回复时间:2007-11-01 07:32 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16
此贴由 贴主 于 [ 2007-11-01 07:32 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(happy):2分   3楼(playboy):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved