鱼C论坛

 找回密码
 立即注册
查看: 2523|回复: 22

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

[复制链接]
发表于 2013-8-10 16:25:41 | 显示全部楼层 |阅读模式
1鱼币
assume cs:code
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
code segment
start: mov ax,a
       mov ds,ax
       mov ax,b
       mov es,ax
       mov bx,0
       mov cx,8
    s: mov al,[bx]
       add es:[bx],al
       inc bx
       loop s
       mov ax,c
       mov ds,ax
       mov bx,0
       mov cx,8
   s0: mov al,es:[bx]
       mov [bx],al
       inc bx
       loop s0
    mov ax,4c00h
    int 21h
code ends
end start


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 16:25:42 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-8-10 16:58 编辑


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

评分

参与人数 1荣誉 +2 鱼币 +5 贡献 +2 收起 理由
Crazy迷恋. + 2 + 5 + 2 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 16:46:50 | 显示全部楼层
红色部分操作后,a段和b段的段址址分别在DS和ES两个寄存器中。
蓝色部分。
mov al,[bx]    ;[bx]指ds:[bx] ,ds可以省略不写,默认为ds,它的段地址为ds
add es:[bx],al  ;es:[bx],段地址在es,写得很清楚,冒号左边。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 16:47:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 16:50:32 | 显示全部楼层
Dardy 发表于 2013-8-10 16:46
红色部分操作后,a段和b段的段址址分别在DS和ES两个寄存器中。
蓝色部分。
mov al,    ;指ds: ,ds可以省 ...

对,但是此时 ds和es不是一样的吗,在cpu中,他们是指同一个段地址啊?但是却又能把a段和b段的数据相加,为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 16:51:07 | 显示全部楼层
话说  code 的段地址不是DS吗  那[bx] 和 es:[bx]当然不同啊
es:[bx]是es为段地址  [bx] 是DS为段地址
应为我记得默认就是DS  除非你写成 类似 es:[bx] 这个样子
我也是新手说错的话望请见谅 说对的话求最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 16:51:31 | 显示全部楼层
红头发 发表于 2013-8-10 16:47
什么叫占位编辑呢

因为我只看到后面那个物理地址的问题,前面关于a\b段的地址是否相同的我漏看了
所以我赶紧把我原本错误的回答删掉
然后填写上占位编辑
就是说占个位置
然后我安心的修改帖子的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 16:53:26 | 显示全部楼层
debug调试时,寄存器的初始值是这样按排的。
所以需要你红色部分的代码重新给ds,es传送一个想要的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 16:57:11 | 显示全部楼层
牡丹花下死做鬼 发表于 2013-8-10 16:51
话说  code 的段地址不是DS吗  那 和 es:当然不同啊
es:是es为段地址   是DS为段地址
应为我记得默认就是 ...

哦,我刚刚检查了一下cpu,发现原来cpu在两个不同的64k段里存放a段和b段,但是这也太奇怪了,有点像数据备份似的。。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 16:57:59 | 显示全部楼层
红头发 发表于 2013-8-10 16:57
哦,我刚刚检查了一下cpu,发现原来cpu在两个不同的64k段里存放a段和b段,但是这也太奇怪了,有点像数据备 ...

是啊 难道放一起??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 17:01:34 | 显示全部楼层
牡丹花下死做鬼 发表于 2013-8-10 16:57
是啊 难道放一起??

检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 17:02:31 | 显示全部楼层
红头发 发表于 2013-8-10 17:01
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?

据我所知 DS  段 和 ES段 不是放在一起的诶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 17:03:51 | 显示全部楼层
小咒 发表于 2013-8-10 16:51
a和b的段地址怎么可能一样呢,首先你定义ds=a es=b
a段
12345678(最前面的1是你ds的段地址的起始地址1 ...

不一样,不一样,刚刚检查cpu时发现了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 17:06:59 | 显示全部楼层
红头发 发表于 2013-8-10 17:01
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?

你可以把ds寄存器的值理解成一个标号就好了
标志着一个段的开始(也可以说是一个段的位置)
每个段的最大值是64k,一个字节也可以占用一个段。
一个字节也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 17:13:35 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-8-10 17:06
你可以把ds寄存器的值理解成一个标号就好了
标志着一个段的开始(也可以说是一个段的位置)
每个段的最大 ...

恩恩,是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-10 17:15:02 | 显示全部楼层
牡丹花下死做鬼 发表于 2013-8-10 17:02
据我所知 DS  段 和 ES段 不是放在一起的诶

嗯,两个是分开的,我在看看其他数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 17:18:58 | 显示全部楼层
红头发 发表于 2013-8-10 17:15
嗯,两个是分开的,我在看看其他数据

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-10 21:34:14 | 显示全部楼层
红头发 发表于 2013-8-10 17:03
不一样,不一样,刚刚检查cpu时发现了。。。

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

使用道具 举报

 楼主| 发表于 2013-8-10 22:58:24 | 显示全部楼层
小咒 发表于 2013-8-10 21:34
恩,很多时候比如你不了解为什么会这样,就编译完成后自己debug一下,从中去了解这些东西绝大部分情况下, ...

嗯,了解到之后会很开心啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 13:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表