sslas 发表于 2011-8-16 11:04:09

求解一个神秘的问题

本帖最后由 sslas 于 2011-8-16 11:08 编辑

assume cs:code,ds:a,ss:b
code segment
    start:mov ax,a
          mov ds,ax

          mov ax,b
          mov ss,ax
          mov sp,10h

          mov bx,0
          mov cx,8
      s:push
          add bx,2
          loop s

mov ax,4c00H
int 21H

code ends

a segment
dw 1,2,3,4,5,6,7,8,9,0aH,0bH,0cH,0dH,0eH,0fH,0ffH
a ends

b segment
dw 0,0,0,0,0,0,0,0
b ends

end start 代码是将a 段前8字型数据push 到b段中代码是正确的 可有一个小疑问如下
-r
AX=4C00BX=0010CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13C3ES=13B1SS=13C5CS=13C1IP=001D   NV UP EI PL NZ AC PO NC
13C1:001D CD21          INT   21
-d 13c3:0
13C3:000001 00 02 00 03 00 04 00-05 00 06 00 07 00 08 00   ................
13C3:001009 00 0A 00 0B 00 0C 00-0D 00 0E 00 0F 00 FF 00   ................
13C3:002008 00 07 00 06 00 05 00-04 00 03 00 02 00 01 00   ................
13C3:003000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C3:004000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C3:005000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C3:006000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C3:007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-d 13c5:0
13C5:000008 00 07 00 06 00 05 00-04 00 03 00 02 00 01 00   ................
13C5:001000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C5:002000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C5:003000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C5:004000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C5:005000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C5:006000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13C5:007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

我定义cs ds ss都是相连的而且每个段都没有超过64kb 怎么在debug中 DS=13C3SS=13C5 CS=13C1
那既然CS=13C1ds 怎么不是13c2 ss怎么不是13c3呢?

javanetwork 发表于 2011-8-16 22:53:36

谁规定段的长度一定是64Kb么
只要你另起一个段segment,段地址默认就改变了 (X+15)/16
b段比a段推后32个字节,ss就比ds增加 (32+15)/16=2
CS比DS增加同理,你可以算下CS段的机器码几个字节

ytrfamli 发表于 2011-9-10 05:28:03

ds跟ss不一定会是差距1个段的.
更何况ds定义了16个word,即是32byte,换成段的差距就是2,
这里跟结果DS=13C3SS=13C5 是吻合的

要注意的是,虽然说一个段的大小最大是64kb,但是这个64kb
是我们人类所见到的,CPU并没有这个认识,在CPU眼里,
段之间的差距(不考虑偏移地址)只有16byte
(每次差1,还要乘上16转成段地址就是10h=16byte.
例如说段地址3456h跟段地址3455h之间就差了16byte.)

cs为何比ds还要往前20h也是一样的道理,cs里面的指令有多少byte
会影响ds的位置,不是因为一个段最多有64kb所以ds一定在cs+1的地方.
(再次强调,回头看一下,64kb是人类看到的.电脑看不到.)

何况,仔细想想,要是CS=13C1DS=13C2 ,那麽,CS段实际上能存多少指令?
只有16Byte!(因为CS实际位置为13C10H,DS为13C20H)
估计写6,7个指令就不能再写了.
页: [1]
查看完整版本: 求解一个神秘的问题