王爽老师在其教材中说:出栈后,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
- . |