李君竟 发表于 2012-8-2 12:58:36

如何知道数据段的段地址 我想知道具体方法!!!

assume cs:code,ds:data
data segment
db 'uniX'
db 'foRK'
data ends
code segment
start:mov al,'a'
   mov bl,'b'
   mov ax,4c00h
   int 21h
code ends
end start

天长地久 发表于 2012-8-2 13:21:59

本帖最后由 天长地久 于 2012-8-2 13:33 编辑

assume cs:code,ds:data
data segment
db 'uniX'
db 'foRK'
data ends
code segment
start:
mov ax,data    ;段地址写入AX中
mov ds,ax   ;DS获取数据段地址
mov si,0    ;SI设置为数据段偏移地址为0
mov al,'a'
   mov bl,'b'
   mov ax,4c00h
   int 21h
code ends
end start

鱼币拿来!!{:5_109:}

李君竟 发表于 2012-8-2 13:57:26

天长地久 发表于 2012-8-2 13:21 static/image/common/back.gif
assume cs:code,ds:data
data segment
db 'uniX'


拜托,我的意思是怎么算出来,不是让你写代码在DEBUG中看,那我也会,书上是这么说的:先用r命令分析一下DATA段的地址,因:DS=0B2D,所以程序从0B3DH段开始,DATA段又是程序中的第一个段,它就在程序的起始处,所以它的段地址为:0B3DH, 我是不知道这是怎么来的,所以才问,不是让你写代码 ,让在DEBUG中看,那我也会!谢谢!还望懂的能帮我解答,谢谢大家!

天长地久 发表于 2012-8-2 14:48:05

为什么要自己算这个段地址呢?真搞不懂你要自己算这个段地址有什么意义!如果DATA段放在代码段后面那不是更不好算!
做一件事总有个目的吧!简单的方法不用,难到你想自己开发编译器吗?

李君竟 发表于 2012-8-2 14:51:11

可是书上算出来了,我就想知道是怎么算的,目的很单纯,知道吗

lukelqz 发表于 2012-8-2 15:31:31

本帖最后由 lukelqz 于 2012-8-2 15:38 编辑

楼主 数据段是你根据自己的数据读写需求,你定义他在哪儿他就在哪儿,然后你就可以使用段寄存器ds和偏移来访问该段的数据,或者给其写入数据。书上p53是怎么说的,
对于8086pc机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N≤64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,定义为数据段

当然如果你愿意可以把cs段作为数据段,只要你能做到你读写数据的时候不覆盖代码段的指令。也可以把es段作为数据段。


比如:你上面的程序
我在start: 后面加上
mov ax,1234h
mov ds,ax那么数据段的段地址就被定义在了1234h,但是1234h处存了什么数据呢?能不能改写呢?是不是我们要读取的数据呢? 我们不知。所以这种定义数据段的段地址一般不用。除非你知道那儿存了什么,正是我需要改写的数据。
如果我在start:后面加上
mov ax,data
mov ds,ax那么数据段的段地址就被定义在了data段处,data段存了什么数据呢?能不能改写呢?哦。看上面还有这么一行代码。
data segment
db 'uniX'
db 'foRK'
data ends
原来data段中存放了8个字节的uniXfoRK的acsll码值,我可以根据需要,读取或者改写。这个data段,也就是被我定义为数据段的段地址具体是多少呢?每个电脑不一定一样哦。不是确定的,系统分配的,如果要知道,只能debug了。其实没必要知道他具体在内存的哪儿,我能通过ds和bx对其读写就够了。

如果我在start:后面加上
mov ax,cs
mov ds,ax那么就把数据段的段地址定义到了cs处。这时就要小心了。因为你读取可以,写入的话,很可能会改写代码段的指令。

我再把你的这个程序的内存情况画一下,参考了书本p92页和p134页的结论。

附上debug验证图


由此可知在如果你不定义DS的情况下,程序的DS默认为SA,这个SA是系统自动找的一段空闲的内存地址,不固定。对于这题把DS定义到data段还是比较好的


楼主我讲的不知道你能不能理解呢{:5_92:}

Uchiha 发表于 2012-8-5 10:32:29

本帖最后由 Uchiha 于 2012-8-5 10:33 编辑

你可能感觉到了.为什么有的程序或者之前有些程序不用+10H?
这是因为之前的程序都是经过指定的DS值的(MOV DS,寄存器),但是程序初始化状态下(也就是说没有经过指向DS,或者是根本没有这个命令)的时候程序的DS值是要+10H的10H是PSP空间,不懂的话可以看第4.9章

如果程序通过像mov ds,ax这样的指令后应该就不需要在ds加10h了

其实楼上的兄弟说的不错

︶ㄣ.蒾途椥返ゞ 发表于 2012-8-20 13:58:11

assume cs:code,ds:data设定的

星空123 发表于 2012-9-6 11:39:47

它是内存硬件分配给定的,“DS”就像指针它指向,data当然在后面跟着了。

星空123 发表于 2012-9-6 11:44:50

你最好看一下,内存是如何分配方面的资料。
你就能理解“lukelqz ”说的。
页: [1]
查看完整版本: 如何知道数据段的段地址 我想知道具体方法!!!