如何查看数据段的数据
代码如下:
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,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
将程序加载入内存后
-r
AX=0000 BX=0000 CX=0042 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14BD ES=14BD SS=14CD CS=14CF IP=0000 NV UP EI PL NZ NA PO NC
14CF:0000 B8CE14 MOV AX,14CE
我想看数据段data的数据,上面-r 出的 DS=14BD,不是直接就-d 14bd:0就可以看到了吗?
为什么要-d 14cd:0 呢?
-d 14cd:0
14CD:0000 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
[解决办法]
程序被加载到内存中的位置是不定的,所以某些带有立即数的性质的数据在可执行程序中其实不是立即数。比如你给出的代码中的 mov ax,data。操作系统在处理这个问题的时候用的是“重定位”。大概的原理好像是在EXE的文件头中将需要重定位的地方以及对应的重定位的方式表示出来,然后操作系统在加载这个可执行程序的时候将对应的带有立即数的指令修改成正确的立即数。我记得可执行程序中那个带有立即数的指令的机器码中的表示立即数的地方好像是0,然后加载到内存之后操作系统再通过可执行文件的文件头将这个0修改成正确的立即数。程序中的每个需要重定位的立即数都需要在可执行程序的文件头中占用一个结构体。这个结构体是怎么定义的我不知道,不过好像是需要重定位的位置和一个偏移量。楼主自己去搜吧,我说的东西可能有错的。