yearn2005 发表于 2013-6-16 02:05:40

检测点10.5卡壳了,老鸟指点下

assume cs:code

stack segment
          dw 8 dup (0)
stack ends
code segment

start:   mov ax,stack
         mov ss,ax
         mov sp,16
         mov ds,ax
         mov ax,0
         call word ptr ds:
         inc ax
         inc ax
         inc ax
   mov ax,4c00h
   int 21h
code ends
end start
以下执行 DEBUG的情况
F:\a>debug 105.exe
-r
AX=0000BX=0000CX=0029DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0000   NV UP EI PL NZ NA PO NC
13EA:0000 B8E913      MOV   AX,13E9
-u
13EA:0000 B8E913      MOV   AX,13E9
13EA:0003 8ED0          MOV   SS,AX
13EA:0005 BC1000      MOV   SP,0010
13EA:0008 8ED8          MOV   DS,AX
13EA:000A B80000      MOV   AX,0000
13EA:000D FF160E00      CALL   
13EA:0011 40            INC   AX
13EA:0012 40            INC   AX
13EA:0013 40            INC   AX
13EA:0014 B8004C      MOV   AX,4C00
13EA:0017 CD21          INT   21
13EA:0019 0000          ADD   ,AL
13EA:001B 0000          ADD   ,AL
13EA:001D 0000          ADD   ,AL
13EA:001F 0000          ADD   ,AL
-d ss:0
13E9:000000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13E9:0010B8 E9 13 8E D0 BC 10 00-8E D8 B8 00 00 FF 16 0E   ................

到这栈段内数据都为0
-t


AX=13E9BX=0000CX=0029DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0003   NV UP EI PL NZ NA PO NC
13EA:0003 8ED0          MOV   SS,AX
-t


AX=13E9BX=0000CX=0029DX=0000SP=0010BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0008   NV UP EI PL NZ NA PO NC
13EA:0008 8ED8          MOV   DS,AX
-d ss:0
13E9:000000 00 00 00 00 00 E9 13-00 00 08 00 EA 13 EB 0D   ................
13E9:0010B8 E9 13 8E D0 BC 10 00-8E D8 B8 00 00 FF 16 0E   ................
执行完mov ss,ax后 栈内数据发生改变
这里一直没想明白,有老鸟出来指点下吗
-



阳光影子 发表于 2013-6-16 02:05:41

大哥,你这个问题和我提问的一样的。电脑还没加载程序的时候,你看看栈段的数据,然后你再加载程序你再看看栈的数据,一边执行一边观察。看看和原来没加载程序的数据对比一下。就明白的了

yearn2005 发表于 2013-6-16 02:10:03

习题答案如下:推算:执行call word ptr ds:指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:)。(ds:)=11h,执行inc ax……最终ax=3 题中特别关照别用debug跟踪,跟踪结果不一定正确,但还是忍不住去试试,看是什么结果。根据单步跟踪发现,执行call word ptr ds:指令时,显示ds:=065D。ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?中断呗~~~~
            没想明白 中断呗~~~~ 这里的意思

1249198560 发表于 2013-6-21 21:59:04

我只是路过打酱油的。

压寨宝宝 发表于 2013-6-22 09:21:41

我咋没发现第二个问题勒?{:5_92:}
页: [1]
查看完整版本: 检测点10.5卡壳了,老鸟指点下