红头发 发表于 2013-8-10 16:25:41

关于段地址的一个问题(实验5的题目)

assume cs:codea segment    db 1,2,3,4,5,6,7,8a endsb segment    db 1,2,3,4,5,6,7,8b endsc segment    db 0,0,0,0,0,0,0,0c endscode segmentstart: mov ax,a       mov ds,ax       mov ax,b       mov es,ax       mov bx,0       mov cx,8    s: mov al,       add es:,al       inc bx       loop s       mov ax,c       mov ds,ax       mov bx,0       mov cx,8   s0: mov al,es:       mov ,al       inc bx       loop s0    mov ax,4c00h    int 21hcode endsend start

在红色的代码段部分,a段和 b段的段地址应该一样的吧,那么蓝色的部分有点疑问,为什么【bx】和es:【bx】是不一样的物理地址呢?

メ㊣逆ご帅☆ 发表于 2013-8-10 16:25:42

本帖最后由 メ㊣逆ご帅☆ 于 2013-8-10 16:58 编辑



a段和b段的段地址不一样啦,因为是两个段啊,一个segment+ends语句就定义了一个段,两个就定义了两个段所以是两个不同的段由于没有指定是哪个段,所以默认就是DS段,也就是说代表ds:那么这个的物理地址就是ds寄存器的值*10h+bx寄存器的值而es:就是es寄存器的值*10h+bx寄存器的值上面       mov ax,a      mov ds,ax      mov ax,b      mov es,ax指定了ds是a段es是b段而a段和b段是两个不同的地址,所以算出来的物理地址是不同的这里假设a段的地址是0(假设假设。。)a segment    db 1,2,3,4,5,6,7,8a ends这里a段定义了8个字节分别为1,2,3......那么b段的地址就是a段地址+8了b segment    db 1,2,3,4,5,6,7,8b ends以此类推c段就是a段地址+8+8c segment    db 0,0,0,0,0,0,0,0c ends接下来的code段地址就是a段地址+8+8+8地址是连续的,而且不同的

Dardy 发表于 2013-8-10 16:46:50

红色部分操作后,a段和b段的段址址分别在DS和ES两个寄存器中。
蓝色部分。
mov al,    ;指ds: ,ds可以省略不写,默认为ds,它的段地址为ds
add es:,al;es:,段地址在es,写得很清楚,冒号左边。

红头发 发表于 2013-8-10 16:47:05

メ㊣逆ご帅☆ 发表于 2013-8-10 16:42 static/image/common/back.gif
看错了,占位编辑

什么叫占位编辑呢

红头发 发表于 2013-8-10 16:50:32

Dardy 发表于 2013-8-10 16:46 static/image/common/back.gif
红色部分操作后,a段和b段的段址址分别在DS和ES两个寄存器中。
蓝色部分。
mov al,    ;指ds: ,ds可以省 ...
对,但是此时 ds和es不是一样的吗,在cpu中,他们是指同一个段地址啊?但是却又能把a段和b段的数据相加,为什么?

牡丹花下死做鬼 发表于 2013-8-10 16:51:07

话说code 的段地址不是DS吗那 和 es:当然不同啊
es:是es为段地址 是DS为段地址
应为我记得默认就是DS除非你写成 类似 es: 这个样子
我也是新手说错的话望请见谅 说对的话求最佳

メ㊣逆ご帅☆ 发表于 2013-8-10 16:51:31

红头发 发表于 2013-8-10 16:47 static/image/common/back.gif
什么叫占位编辑呢

因为我只看到后面那个物理地址的问题,前面关于a\b段的地址是否相同的我漏看了
所以我赶紧把我原本错误的回答删掉
然后填写上占位编辑
就是说占个位置
然后我安心的修改帖子的内容

小咒 发表于 2013-8-10 16:51:50

a segment
    db 1,2,3,4,5,6,7,8
a ends

b segment
    db 1,2,3,4,5,6,7,8
b ends

c segment
    db 0,0,0,0,0,0,0,0
c ends
a和b的段地址怎么可能一样呢,首先你定义ds=a es=b
a段
12345678(最前面的1是你ds的段地址的起始地址1的偏移地址为0)
b段
12345678(最前面的1是你es的段地址的起始地址1的偏移地址为0)

Dardy 发表于 2013-8-10 16:53:26

debug调试时,寄存器的初始值是这样按排的。
所以需要你红色部分的代码重新给ds,es传送一个想要的值。

红头发 发表于 2013-8-10 16:57:11

牡丹花下死做鬼 发表于 2013-8-10 16:51 static/image/common/back.gif
话说code 的段地址不是DS吗那 和 es:当然不同啊
es:是es为段地址   是DS为段地址
应为我记得默认就是 ...

哦,我刚刚检查了一下cpu,发现原来cpu在两个不同的64k段里存放a段和b段,但是这也太奇怪了,有点像数据备份似的。。谢谢

牡丹花下死做鬼 发表于 2013-8-10 16:57:59

红头发 发表于 2013-8-10 16:57 static/image/common/back.gif
哦,我刚刚检查了一下cpu,发现原来cpu在两个不同的64k段里存放a段和b段,但是这也太奇怪了,有点像数据备 ...

是啊 难道放一起??

红头发 发表于 2013-8-10 17:01:34

牡丹花下死做鬼 发表于 2013-8-10 16:57 static/image/common/back.gif
是啊 难道放一起??

检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?

牡丹花下死做鬼 发表于 2013-8-10 17:02:31

红头发 发表于 2013-8-10 17:01 static/image/common/back.gif
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?

据我所知 DS段 和 ES段 不是放在一起的诶

红头发 发表于 2013-8-10 17:03:51

小咒 发表于 2013-8-10 16:51 static/image/common/back.gif
a和b的段地址怎么可能一样呢,首先你定义ds=a es=b
a段
12345678(最前面的1是你ds的段地址的起始地址1 ...

不一样,不一样,刚刚检查cpu时发现了。。。{:5_109:}

メ㊣逆ご帅☆ 发表于 2013-8-10 17:06:59

红头发 发表于 2013-8-10 17:01 static/image/common/back.gif
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?

你可以把ds寄存器的值理解成一个标号就好了
标志着一个段的开始(也可以说是一个段的位置)
每个段的最大值是64k,一个字节也可以占用一个段。
一个字节也可以

红头发 发表于 2013-8-10 17:13:35

メ㊣逆ご帅☆ 发表于 2013-8-10 17:06 static/image/common/back.gif
你可以把ds寄存器的值理解成一个标号就好了
标志着一个段的开始(也可以说是一个段的位置)
每个段的最大 ...

恩恩,是这样的{:5_108:}

红头发 发表于 2013-8-10 17:15:02

牡丹花下死做鬼 发表于 2013-8-10 17:02 static/image/common/back.gif
据我所知 DS段 和 ES段 不是放在一起的诶

嗯,两个是分开的,我在看看其他数据

牡丹花下死做鬼 发表于 2013-8-10 17:18:58

红头发 发表于 2013-8-10 17:15 static/image/common/back.gif
嗯,两个是分开的,我在看看其他数据

所以 你的那个code段 的段地址 就是DS啊
mov ax,a
mov ds,ax/*确定了段地址的值*/
mov al, 就是把 ds:的值给al
然后mov ax,b
       mov es,ax/*定义es的值*/
add es:,al/*把al的值给es:*/
有什么问题吗、??


小咒 发表于 2013-8-10 21:34:14

红头发 发表于 2013-8-10 17:03 static/image/common/back.gif
不一样,不一样,刚刚检查cpu时发现了。。。

恩,很多时候比如你不了解为什么会这样,就编译完成后自己debug一下,从中去了解这些东西绝大部分情况下,你就会豁然开朗了(除非涉及到的是你没有学到的),当然课程中小甲鱼说过一句话没学到的东西我们以后再去分析,顺着课程学下去总会都了解的

红头发 发表于 2013-8-10 22:58:24

小咒 发表于 2013-8-10 21:34 static/image/common/back.gif
恩,很多时候比如你不了解为什么会这样,就编译完成后自己debug一下,从中去了解这些东西绝大部分情况下, ...

嗯,了解到之后会很开心啊
页: [1] 2
查看完整版本: 关于段地址的一个问题(实验5的题目)