关于段地址的一个问题(实验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: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地址是连续的,而且不同的
红色部分操作后,a段和b段的段址址分别在DS和ES两个寄存器中。
蓝色部分。
mov al, ;指ds: ,ds可以省略不写,默认为ds,它的段地址为ds
add es:,al;es:,段地址在es,写得很清楚,冒号左边。
メ㊣逆ご帅☆ 发表于 2013-8-10 16:42 static/image/common/back.gif
看错了,占位编辑
什么叫占位编辑呢 Dardy 发表于 2013-8-10 16:46 static/image/common/back.gif
红色部分操作后,a段和b段的段址址分别在DS和ES两个寄存器中。
蓝色部分。
mov al, ;指ds: ,ds可以省 ...
对,但是此时 ds和es不是一样的吗,在cpu中,他们是指同一个段地址啊?但是却又能把a段和b段的数据相加,为什么? 话说code 的段地址不是DS吗那 和 es:当然不同啊
es:是es为段地址 是DS为段地址
应为我记得默认就是DS除非你写成 类似 es: 这个样子
我也是新手说错的话望请见谅 说对的话求最佳 红头发 发表于 2013-8-10 16:47 static/image/common/back.gif
什么叫占位编辑呢
因为我只看到后面那个物理地址的问题,前面关于a\b段的地址是否相同的我漏看了
所以我赶紧把我原本错误的回答删掉
然后填写上占位编辑
就是说占个位置
然后我安心的修改帖子的内容 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) debug调试时,寄存器的初始值是这样按排的。
所以需要你红色部分的代码重新给ds,es传送一个想要的值。 牡丹花下死做鬼 发表于 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 static/image/common/back.gif
哦,我刚刚检查了一下cpu,发现原来cpu在两个不同的64k段里存放a段和b段,但是这也太奇怪了,有点像数据备 ...
是啊 难道放一起?? 牡丹花下死做鬼 发表于 2013-8-10 16:57 static/image/common/back.gif
是啊 难道放一起??
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗? 红头发 发表于 2013-8-10 17:01 static/image/common/back.gif
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?
据我所知 DS段 和 ES段 不是放在一起的诶 小咒 发表于 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:01 static/image/common/back.gif
检查cpu发现在ds段中也有b段的数据啊,这难道不是吗?
你可以把ds寄存器的值理解成一个标号就好了
标志着一个段的开始(也可以说是一个段的位置)
每个段的最大值是64k,一个字节也可以占用一个段。
一个字节也可以
メ㊣逆ご帅☆ 发表于 2013-8-10 17:06 static/image/common/back.gif
你可以把ds寄存器的值理解成一个标号就好了
标志着一个段的开始(也可以说是一个段的位置)
每个段的最大 ...
恩恩,是这样的{:5_108:} 牡丹花下死做鬼 发表于 2013-8-10 17:02 static/image/common/back.gif
据我所知 DS段 和 ES段 不是放在一起的诶
嗯,两个是分开的,我在看看其他数据 红头发 发表于 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 17:03 static/image/common/back.gif
不一样,不一样,刚刚检查cpu时发现了。。。
恩,很多时候比如你不了解为什么会这样,就编译完成后自己debug一下,从中去了解这些东西绝大部分情况下,你就会豁然开朗了(除非涉及到的是你没有学到的),当然课程中小甲鱼说过一句话没学到的东西我们以后再去分析,顺着课程学下去总会都了解的 小咒 发表于 2013-8-10 21:34 static/image/common/back.gif
恩,很多时候比如你不了解为什么会这样,就编译完成后自己debug一下,从中去了解这些东西绝大部分情况下, ...
嗯,了解到之后会很开心啊
页:
[1]
2