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

怎么查看数据段的数据

2013-03-19 
如何查看数据段的数据代码如下:assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,

如何查看数据段的数据
代码如下:
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修改成正确的立即数。程序中的每个需要重定位的立即数都需要在可执行程序的文件头中占用一个结构体。这个结构体是怎么定义的我不知道,不过好像是需要重定位的位置和一个偏移量。楼主自己去搜吧,我说的东西可能有错的。

热点排行