. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
主题 : :  又是关于debug的问题  [已解决] 回复[ 6次 ]   点击[ 1206次 ]  
goal00001111
[帖 主] [ 发表时间:2007-10-29 10:21 ] 
荣誉值: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 ] 
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16
修改:“接下来继续执行指令,我发现每执行一个入栈指令,0AF2H就向左移动;而执行出栈指令后,0AF2H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!”改为
“接下来继续执行指令,我发现每执行一个入栈指令,0556H就向左移动;而执行出栈指令后,0556H向右移动。这和王爽老师所说的并不相同啊!到底是怎么一回事呢?请各位大虾指教!”。
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved