新手学汇编,请教各位前辈一个问题!
如下这段代码:
assume cs:codesg
stack segment
db 16 dup (0)
stack ends
codesg segment
start:mov ax,stack
mov ss,ax
mov sp,16
ret
codesg ends
将上面的代码编译后进行如下调试:
-u
182A:0000 B82918 MOV AX,1829 ;获取到栈段地址为:1829
182A:0003 8ED0 MOV SS,AX
182A:0005 BC1000 MOV SP,0010
182A:0008 C3 RET
-d 1829:0 f ;查看栈段的初始值
1829:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ;值都为零
-t ;执行MOV AX,1829命令
AX=1829 BX=0000 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1819 ES=1819 SS=1829 CS=182A IP=0003 NV UP EI PL NZ NA PO NC
182A:0003 8ED0 MOV SS,AX
-d 1829:0 f ;查看栈段值
1829:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ;值不变
-t ;执行MOV SS,AX命令
AX=1829 BX=0000 CX=0019 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=1819 ES=1819 SS=1829 CS=182A IP=0008 NV UP EI PL NZ NA PO NC
182A:0008 C3 RET
-d 1829:0 f ;查看栈段值
1829:0000 00 00 00 00 00 00 29 18-00 00 08 00 2A 18 2A 12 ;值发生变化了(?)
-t ;执行ret命令
AX=1829 BX=0000 CX=0019 DX=0000 SP=0012 BP=0000 SI=0000 DI=0000
DS=1819 ES=1819 SS=1829 CS=182A IP=29B8 NV UP EI PL NZ NA PO NC
182A:29B8 7F04 JG 29BE
-d 1829:0 f ;查看栈段值
1829:0000 00 00 00 00 00 00 29 18-29 18 00 00 B8 29 2A 18 ;值又发生了变化(?)
请问在上面这段代码的执行过程中,都没有堆栈段进行入栈、出栈(push、pop)操作,为什么栈段中的值会发生变化呢? 汇编 栈段
[解决办法]
因为 debug 本身需要使用这个堆栈。
[解决办法]
ret 指令会修改堆栈的
[解决办法]
发现没?最后执行RET后 栈段的最后为B8 29 2A 18 正好是CS:IP,这是RET指令引起的