汇编不会编 发表于 2012-12-9 13:19:31

段地址*16+偏移地址=物理地址

本帖最后由 汇编不会编 于 2012-12-11 16:30 编辑


段地址为什么要*16 呢?

是不是因为x86CPU是16位的呢?

不太了解这节课,又不想跳过这节课。所以来求助了,希望得到详细的解答 呵呵

NGtailang 发表于 2012-12-9 19:25:42

因为 8086CPU有20位地址总线的,而8086又是16位的,所以要像办法凑成20位的。所以有了
物理地址=段地址*16+偏移地址

shdfsbgfjks 发表于 2012-12-9 22:17:33

因为8086的段寄存器都是16位的,地址线是20条,所以cpu无法直接给出20位的地址,所以就物理地址=段地址*16+16的偏移地址

shdfsbgfjks 发表于 2012-12-9 22:18:17

因为8086的段寄存器都是16位的,地址线是20条,所以cpu无法直接给出20位的地址,所以就物理地址=段地址*16+16的偏移地址

张国祥 发表于 2012-12-10 12:20:02

你可以将其化为二进制数,然后将段地址*10000b,看看结果?

六顺 发表于 2012-12-10 12:24:38

我是这么理解的,内部连接总线是16位,CPU与外部连接时是20位的总线,其实段地址就如其名,它是对一组地址进行定义,*16(左移4位即2的4次方=16)定义了这个段的长度范围和对段地址的起始点进行了定位,偏移地址则是定义到这个长度内其中一个点,而CPU通过20位的外部总线连接到内存时就将它们合并起来,便于对内存进行分段管理。

阿帕奇 发表于 2012-12-11 16:19:05

我解释给你听:
8086CPU是20根地址线,这样它所能访问的地址范围是2的20次方=1M大小.
因为寄存器是16位的,最多只能访问2的16次方个地址,无法访问1M的全部空间.所以就人为的把1M空间分成若干个段来表示. 也就是说通过改变起点位置的变化就可以表示整个1M内存范围了.
现在的CPU寄存器是32位的,总线也是32位的,都可以直接访问4GB的范围了,所以也就不用以前的表示方法了

汇编不会编 发表于 2012-12-11 16:28:41

阿帕奇 发表于 2012-12-11 16:19 static/image/common/back.gif
我解释给你听:
8086CPU是20根地址线,这样它所能访问的地址范围是2的20次方=1M大小.
因为寄存器是16位的,最 ...

谢谢你的解答!呵呵
页: [1]
查看完整版本: 段地址*16+偏移地址=物理地址