syleiying 发表于 2014-2-3 12:48:26

书中2.12小节的一些疑问

书中,2.12 小节 代码段
中说:"在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将长度为N(N≤64KB)的一组代码,
            存在一组地址连续、起始地址为16的倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,从而定义了一个代
            码段。"

那么是不是说,一个代码段的第一个内存单元一定必须是16的倍数才行,假如,我把一段代码写入到内存20001H到20008H里了,是不是就因为第一个20001H不是16的倍数,我就不能把20001H到20008H看成是一个代码段了呢?

无名侠 发表于 2014-2-3 14:11:15

不一定要是16的倍数,但是和16对齐可以发挥硬件的最大性能,为什么我就不知道了。

vvqboy 发表于 2014-2-4 22:38:39

20001H到20008H,不是段,楼主还没分清代码段和偏移地址
2000H 这是段,0001H,这是偏移地址
段都要*16,所以段都是16的倍数

syleiying 发表于 2014-2-5 15:10:03

vvqboy 发表于 2014-2-4 22:38 static/image/common/back.gif
20001H到20008H,不是段,楼主还没分清代码段和偏移地址
2000H 这是段,0001H,这是偏移地址
段都要*16, ...

首先谢谢您的回复,毕竟您的回复说得很贴切。很多其他人都懒得理这贴!
我知道20001H到20008H不是段,但书中不是说可以把这种连续的内存单元看成是一个段吗(书24页图29),只不过书中所举的例子都是像10000H到1007FH为一个段或者10080H到100FFH为一个段,那难道不能把10001H到1007FH看作一个段;把10081H到100FFH看作一个段吗?这些不也是连续的内存单元吗。如果可以的话,那么为何又说“用段地址乘以16 定位段的起始地址(基础地址)”,起始地址不就是第一个内存单元吗,10001H及10081H就应该是起始地址啊,但它们不是16的倍数啊。如果您懂得我的意思,麻烦您帮帮我,仔细讲一下给我好吗,我实在是迷茫了,都没心思往下看了。

powerpro 发表于 2014-2-6 23:03:51

多尝试啊,多看也不行,得边看边练习。

vvqboy 发表于 2014-2-9 08:34:53

syleiying 发表于 2014-2-5 15:10 static/image/common/back.gif
首先谢谢您的回复,毕竟您的回复说得很贴切。很多其他人都懒得理这贴!
我知道20001H到20008H不是段,但 ...

"把10081H到100FFH看作一个段"
这不算一个段,1000H才是段
至于10081H到100FFH,这是一段内存空间,不是段。
在8086CPU中,有4个段寄存器 CS DS SS ES
一个段寄存器最大能存储的是FFFFH
注意,这4个玩意叫“段寄存器”,名字不是瞎起的
存在段寄存器里的数据才叫段

春卷の爱 发表于 2014-2-9 10:47:02

powerpro 发表于 2014-2-6 23:03 static/image/common/back.gif
多尝试啊,多看也不行,得边看边练习。

段是不会有零头的,因为段地址是16进制整数,X16以后就多出来一个零
就好像十进制数中任意一个整数,X10以后,个位数肯定是0

zouyang 发表于 2014-2-9 11:02:29

路过,来看看
页: [1]
查看完整版本: 书中2.12小节的一些疑问