一道难题,思考了n久
assume cs:code
code segment
dw 0123H,0456H,0789H,0abcH,0defh,0fedh,0cbah,0987H
dw 0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,32
mov bx,0
mov cx,8
;入栈
s:push cs:[bx]
add bx,2
loop s
;出栈
mov bx,0
mov cx,8
s0:pop cs:[bx]
add bx,2
loop s0
mov ax,4c00H
int 21h
code ends
end start
程序运行结果:
-d cs:0
0B51:0000 87 09 BA 0C ED OF EF 0D-13 3E 4F 03 00 00 00 00
0B51:0010 00 00 00 00 00 00 41 0B-5C 05 48 00 41 0B 12 72
...
程序的目的是想让数据0123H,0456H,0789H,0abcH,0defh,0fedh,0cbah,0987H逆序存放
结果没有安逆序存放,问题会出在哪里呢?
我的运行环境:wxp sp2+masm611,
问题点数:100、回复次数:6Top
1 楼zara(Kyrie eleison)回复于 2006-02-03 19:39:31 得分 0
我在 2k 下是正常的. 只是, 最好不要在程序里面进行单步调试, 因为, 你的堆栈较小, 很容易就溢出到数据区部分, 从而破坏掉那里的数据. 应该在执行时一气呵成: g 46, 46 是 int21h 的指令的地址
-D CS:0 L 20
0B4A:0000 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09 #.V.............
0B4A:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-G 46
AX=4C00 BX=0010 CX=0000 DX=0000 SP=0020 BP=0000 SI=0000 DI=0000
DS=0B3A ES=0B3A SS=0B4A CS=0B4A IP=0046 NV UP EI PL NZ AC PO NC
0B4A:0046 CD21 INT 21
-D CS:0 L 20
0B4A:0000 87 09 BA 0C ED 0F EF 0D-BC 0A 89 07 56 04 23 01 ............V.#.
0B4A:0010 87 09 BA 0C ED 0F EF 0D-00 00 46 00 4A 0B 58 05 ..........F.J.X.Top
2 楼fangge(fangge)回复于 2006-02-03 20:50:24 得分 0
谢谢!
按照你的调试方法试了一下成功了,
可是有个疑问,单步调试的时候会占用栈的空间吗?如果是,又是什么占用了栈的空间呢?Top
3 楼zara(Kyrie eleison)回复于 2006-02-04 09:22:34 得分 60
单步调试时是可能会占用用户程序的堆栈空间的, 具体占用的大小和调试程序还有关系. 所用到的空间一是中断时的压栈信息 (标记寄存器, 返回的远地址), 还有就是调试程序可能直接使用用户的堆栈空间来保存些信息, 比如对使用到的寄存器进行 push 保护, 结束时 pop 恢复等等. 在你的这个程序中, 实际的堆栈空间是 cs:0010 - cs:001f. 在数据压栈之后再回存时, 单步中断的话, 就可能会占用到前面部分的空间Top
4 楼fangge(fangge)回复于 2006-02-04 11:27:31 得分 0
这么说,如果把栈的空间设置大点,单步调试的时候就没有问题了吗?Top
5 楼VxD1(Dump)回复于 2006-02-04 11:32:59 得分 40
dw 0123H,0456H,0789H,0abcH,0defh,0fedh,0cbah,0987H
dw 中间加些空间应该就没事了
dw 0,0,0,0,0,0,0,0Top
6 楼zara(Kyrie eleison)回复于 2006-02-04 12:20:38 得分 0
栈空间加大就可以的, 但是除了在 VxD1 所说的中间再加些之外, mov sp,32 这一句也应该作调整Top




