CarpeDiem 发表于 2013-5-19 02:59:00

关于代码段的长度


鱼哥您好,上面这段话这段话我的理解是,一个代码段的长度不能超过16个二进制位,对不?如果是这样的话,那么下面这段话
它说123B0H~123B9H是一个代码段,那么这个代码段的长度是10个字节即80个二进制位,这样不是超过了代码段允许的长度范围了么?


刚刚开始学汇编,对计算机内部工作机制了解很浅,问题要是很弱智的话多多见谅啊~

熊文杰 发表于 2013-5-19 02:59:01

我怕我说的不够明白细致,我这里再补充一下。直接拿你给的图上的例子说把。
0x123b0到0x123b9
这个123b0是一个地址。这个地址由段地址和偏移地址组成。段地址*16 + 偏移地址就是一个物理地址。
这里的123b0可以看成 段地址123b,偏移地址0,表示为123b:0

由于8086的寄存器是16位的,也就是说偏移地址最多只能是123b:ffff
(FFFF 就是16个2进制位全部是1 也就是2进制的1111111111111111);
0~FFFF 总共这么多个地址,一个地址占1一个字节。也就是换算出来偏移地址最多为64KB大小的空间。


10B跟64KB比起来 小太多了。

熊文杰 发表于 2013-5-19 03:08:53

楼主,那段视频里面说的 一个代码段的长度不能超过16个二进制位,这个是没有错。16个2进制位总共可以形成2的16次方个地址,一个地址占一个字节,也就是64kB,也就是说,一个段空间占64KB。
10B显然是小于64kb的。如果哪里还有不明白的,可以继续问。

CarpeDiem 发表于 2013-5-19 10:33:52

熊文杰 发表于 2013-5-19 03:50 static/image/common/back.gif
我怕我说的不够明白细致,我这里再补充一下。直接拿你给的图上的例子说把。
0x123b0到0x123b9
这个123b0是 ...

多谢您的回答!基本明白了,还有一个地方不清楚:为什么一个地址占一个字节呢?一个字节不是应该等于8位二进制位吗?

熊文杰 发表于 2013-5-19 13:46:19

CarpeDiem 发表于 2013-5-19 10:33 static/image/common/back.gif
多谢您的回答!基本明白了,还有一个地方不清楚:为什么一个地址占一个字节呢?一个字节不是应该等于8位二 ...

我大概明白你的疑惑在哪里了,这么跟你说把

cpu识别内存就是靠地址来识别,一个地址就就是一个ID,代表一个单元的内存。比如说,你的计算机所有的内存是4G(这个4G包括所有的内存,主板中的,显卡中的,内存条,寄存器等等),因为内存的基本单元就是1个字节。所以总共就有2的32次方个地址。一个地址指向一个单元的空间。


1个字节是等于8bit,一个寄存器只有16位,2个字节空间,这个2个字节的空间是用来存放偏移地址而不是用来存放代码的,代码存在在 这个16位所表示的值所在的位置。比如:
0x123b:0~ 0x123b:9
代码就放在123b:0~ 0x123b:9这10个字节的的内存单元中,然而0x123b:0这个地址值是存放在cs和ip这两个16寄存器中的。


韩不懂 发表于 2013-5-19 19:28:59

无回帖,不论坛,这才是人道。

77630839413 发表于 2013-5-24 00:37:18

犀利{:1_1:}

yearn2005 发表于 2013-5-24 06:47:03

说到这个问题 ,忽然想到 32位XP的内存寻址 有2的32方 =4096M 算是4GB把。可我的电脑插的4GB 就认3GB   
页: [1]
查看完整版本: 关于代码段的长度