如何查看数据段的数据

coder神农 2013-01-17 01:56:23
代码如下:
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
...全文
465 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
申祷无 2013-01-20
  • 打赏
  • 举报
回复
程序被加载到内存中的位置是不定的,所以某些带有立即数的性质的数据在可执行程序中其实不是立即数。比如你给出的代码中的 mov ax,data。操作系统在处理这个问题的时候用的是“重定位”。大概的原理好像是在EXE的文件头中将需要重定位的地方以及对应的重定位的方式表示出来,然后操作系统在加载这个可执行程序的时候将对应的带有立即数的指令修改成正确的立即数。我记得可执行程序中那个带有立即数的指令的机器码中的表示立即数的地方好像是0,然后加载到内存之后操作系统再通过可执行文件的文件头将这个0修改成正确的立即数。程序中的每个需要重定位的立即数都需要在可执行程序的文件头中占用一个结构体。这个结构体是怎么定义的我不知道,不过好像是需要重定位的位置和一个偏移量。楼主自己去搜吧,我说的东西可能有错的。
纯中文 2013-01-17
  • 打赏
  • 举报
回复
mov ax,data mov ds,ax 要赋值以后才是。
coder神农 2013-01-17
  • 打赏
  • 举报
回复
我不明白的是DS不是就是数据段的地址吗?
纯中文 2013-01-17
  • 打赏
  • 举报
回复
因为 14cd 是数据段的地址,而 14bd 不是。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧