Memory management x86分段存储器

Memory management x86分段存储器,memory-management,cpu-architecture,x86-16,memory-segmentation,Memory Management,Cpu Architecture,X86 16,Memory Segmentation,前几天在读《组装艺术》的时候,我来到了关于记忆布局的部分。它开始讨论分段记忆,我认为它没有多大意义 将内存拆分为段作为组织的一种方式非常有意义,但是使用函数段+偏移量,当函数重复其输出时,您会怎么做?e、 g.1038+57、57+1038和1095+0都指向线性地址1095。这不是一件坏事吗?当您无意中寻址相同的线性内存空间时,您是否会意外地寻址相同的线性内存空间 Wikipedia说,它可以发挥优势,“例如在处理多个嵌套数据结构时”,但如何使用它更快地处理嵌套结构呢?您错过了文本中关于如何计

前几天在读《组装艺术》的时候,我来到了关于记忆布局的部分。它开始讨论分段记忆,我认为它没有多大意义

将内存拆分为段作为组织的一种方式非常有意义,但是使用函数
段+偏移量
,当函数重复其输出时,您会怎么做?e、 g.
1038+57
57+1038
1095+0
都指向线性地址1095。这不是一件坏事吗?当您无意中寻址相同的线性内存空间时,您是否会意外地寻址相同的线性内存空间


Wikipedia说,它可以发挥优势,“例如在处理多个嵌套数据结构时”,但如何使用它更快地处理嵌套结构呢?

您错过了文本中关于如何计算这些地址的重要部分

在8086、8088、80186和80188(以及其他以实模式运行的处理器)上,将段映射到物理地址的功能非常简单CPU将段值乘以十六(10h),并将偏移部分相加。


别忘了这些地址总是用十六进制计算。

但这仍然留下了这个问题:
4*16+0=64
0*16+64=64
。将段乘以基数并不能消除为不同参数生成相同输出的函数。请阅读80x86上的4.4规范化地址部分,它涵盖了您的问题;)。正如其中一部分所述,就我在大学一年的记忆中,他们认为我们是这样的:你有一个大小为N个单词的内存,你可以把它分成M个段,每个段由K个单词组成。你可以把地址分成它的段和偏移部分,但是偏移量只会从0增加到FFh,这将避免在计算实际地址时出现问题…不要让这些段让您太困惑,继续阅读代码段、数据段等部分,它会把事情弄清楚。它不是一种物理的内存划分,而是编译器使用的解释和表示,等等,你会看到……啊,我想那一部分刚刚被我点击了。我想我现在明白了。我会确保给第四章多一点时间!我非常怀疑CPU是否使用任何“十六进制”。它使用二进制。十六进制是人类的一种表示形式。