回 帖 发 新 帖 刷新版面

主题:为何源代码中的数据段不是ds,而是ds+16?

完整代码是这样的。
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends

code segment
start: mov ax,stack
       mov ss,ax
       mov sp,16
       mov ax,data
       mov ds,ax
       push ds:[0]
       push ds:[2]
       pop ds:[2]
       pop ds:[0]
       mov ax,4c00h
       int 21h
code ends
end start
================================================================
debug程序的时候,r命令显示:
AX=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=13B5  ES=13B5  SS=13C5  CS=13C7  IP=0000   NV UP EI PL NZ NA PO NC
13C7:0000 B8C613        MOV     AX,13C6

我以为DS=13B5,即data=13B5.
可是用u命令查看,发现:
-u
13C7:0000 B8C613        MOV     AX,13C6
13C7:0003 8ED0          MOV     SS,AX
13C7:0005 BC1000        MOV     SP,0010
13C7:0008 B8C513        MOV     AX,13C5
13C7:000B 8ED8          MOV     DS,AX
13C7:000D FF360000      PUSH    [0000]
13C7:0011 FF360200      PUSH    [0002]
13C7:0015 8F060200      POP     [0002]
13C7:0019 8F060000      POP     [0000]
13C7:001D B8004C        MOV     AX,4C00

明显认为data= 13C5.
d命令查看,发现也确实把0123h,0456h放到了13C5段中。
为什么啊???为什么data是13c5???

回复列表 (共3个回复)

沙发

连接器在处理目标文件,会为你选择一个它认为有效的段地址.

如果它选择的地址有一些问题,那么操作系统在把程序装入内存时,会进行重定位。

希望我没有讲错。你还是问问老师吧。

板凳

跟重定位没关系的吧,我第一次debug已经是在重定位之后了阿。。。

3 楼

???
这样说,我就不明白你的问题是什么了

我来回复

您尚未登录,请登录后再回复。点此登录或注册