首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

新手学汇编,前辈一个有关问题

2013-04-09 
新手学汇编,请教各位前辈一个问题!如下这段代码:assume cs:codesgstack segmentdb 16 dup (0)stack endsco

新手学汇编,请教各位前辈一个问题!
如下这段代码:
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指令引起的

热点排行