汇编段的问题

DATASSEGMENTdd2dup(2,2)DATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:... DATAS SEGMENT
dd 2 dup (2,2)
DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS ;这条指令在这个程序生成.exe后用Debug反汇编后
MOV DS,AX
MOV AH,4CH
INT 21H
CODES ENDS
END START
MOV AX,DATAS ;这条指令在这个程序生成.exe后用Debug反汇编后
第二个操作数成为了一个立即数,那程序怎么使用这个段?
展开
 我来答
做而论道
高能答主

2011-10-30 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:8339万
展开全部
这个立即数,实际上,是DOS操作系统给它写入的。
也就是说,这个立即数,是DOS操作系统临时给它分配的。
如果,在DOS环境中,先执行一个驻留内存的程序,然后你再用DEBUG 反汇编同一个程序,你就会发现,这个立即数,变了 !!!
因为这时,DOS系统分配给它的空间,不是刚才那个了,刚才那个空间,已经被驻留程序占用了。
说了这么多,也就是说,同一个程序,在不同的环境下,这个段地址,是不同的,是DOS临时安排的。
另外,当你用16进制的编辑器,直接查看程序代码,你会发现,反汇编时出现的立即数,在程序代码里面,根本就不是这个数字,它是DOS系统给临时改的。
永星天恒
2011-10-30 · TA获得超过1204个赞
知道小有建树答主
回答量:439
采纳率:100%
帮助的人:231万
展开全部
DATAS存入了DS中,要是用这个段,就是使用DS中的值
如果不把DATAS放在段寄存器(DS、ES等)中,是无法使用该段的
所以才会有这两条指令:
MOV AX,DATAS
MOV DS,AX
追问
MOV AX,DATAS 那这条指令在生成可执行文件后再反汇编就变成了 MOV AX,立即数  mov ds,ax那不就是把DS设置成一段固定的内存了吗?
可DATAS段是在相对这个可持执行文件的起始位置而存在的啊?
那不管程序加载在哪一段内存DS的值都是固定了?
追答
DATAS的值是系统分配的,在分配之前不确定
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超脑001
2011-10-30 · TA获得超过110个赞
知道答主
回答量:72
采纳率:0%
帮助的人:47.9万
展开全部
这是正确的,“DATAS”在编译好的EXE程序里是不存在的,它已经被替换成了合适的立即数!如果你用DEBUG 来汇编的话,你会发现像“DATAS”以及标号都是不能用的。实际上它们都必须使用立即数!但由于这样很烦麻,如果在调试程序时改变了某条命令,可能需要改变程序里所有的表示地址的立即数,所以为了调试方便,才有了MASM这样可以用代号(如标号和前面的“DATAS”),确切的说,MASM已经不是初级的汇编程序了,它的源文件要经过很多步骤才能形成EXE,而DEBUG的源文件只要一步就可以生成EXE,它是直译的!
追问
额那这个合适的立即数不就是把DS指向的段给定死了么,,,段的定位应给是相对操作系统把这个可执行文件加载的位置来确定的呀!那这样使用和使用不安全内存空不是一样了么?
追答
你看一下反汇编的代码就清楚了:
13D8:0000 B8D713 MOV AX,13D7
13D8:0003 8ED8 MOV DS,AX
13D8:0005 B44C MOV AH,4C
13D8:0007 CD21 INT 21
而用WINHEX打开这个EXE程序却是:B8 00 00 8E D8 B4 4C CD 21 !这里的00 00 被操作系统赋值 13D7 即CS-1
换句话说,在程序里地址是死的,但在执行时因其所在内存中位置不同而有所改变,这是EXE程序执行时的规范!
下面是一个COM程序反汇编的结果
-u

13C6:0100 B8D713 MOV AX,13D7
13C6:0103 8ED8 MOV DS,AX
13C6:0105 B44C MOV AH,4C
13C6:0107 CD21 INT 21

而用WINHEX打开这个程序仍是:B8 D7 13 8E D8 B4 4C CD 21。
详细的原因可以查一下EXE程序规范!

EXE文件分为两个部分: EXE头部和程序本体. EXE头部的大小由EXE文件的+08处的字表示, 以节(10h字节)为单位. EXE的14h处的双字是初始的CS:IP, 它是相对于EXE文件的程序本体的. 即程序初始入口在文件中的偏移地址: (word08h+word16h)*10h+word14h
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式