【问题标题】:x86 Segmented Memoryx86 分段内存
【发布时间】:2013-08-18 08:50:01
【问题描述】:

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

将内存分割成段作为一种组织方式非常有意义,但是使用函数segment + offset,当函数重复输出时你会怎么做?例如1038 + 5757 + 10381095 + 0都出来线性地址1095,这不是坏事吗?当您不打算这样做时,您不会不小心处理相同的线性内存空间吗?

维基百科说它可以用于一个优势,“例如在处理多个嵌套数据结构时”,但是如何使用它来更快地处理嵌套结构?

【问题讨论】:

    标签: memory-management cpu-architecture x86-16 memory-segmentation


    【解决方案1】:

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

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

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

    【讨论】:

    • 但这仍然留下了这个问题:4 * 16 + 0 = 640 * 16 + 64 = 64。将段乘以基数不会消除为不同参数产生相同输出的函数。
    • 阅读 80x86 上的 4.4 规范化地址部分,它涵盖了您的问题;)。正如它在一部分中所说的那样,据我记得大学那年,他们是这样认为的:你有一个大小为 N 个单词的记忆,你可以将它分成 M 个片段,每个片段由 K 个单词组成,例如。您可以将地址划分为其段和偏移部分,但偏移量只会从 0 进展到 FFh,这将避免在计算实际地址时出现问题...
    • 不要让那些段混淆你,继续阅读查看代码段,数据段等部分,它会清楚的。无论如何,这不是内存的物理划分,而是编译器使用的解释和表示等等,你会看到......
    • 啊,我认为那个部分刚刚点击了我。我想我现在明白了。我会确保给第 4 章多一点时间!
    • 我非常怀疑CPU使用任何“十六进制系统”。它使用二进制。那么十六进制是 humansrepresentation
    猜你喜欢
    • 2016-02-26
    • 2019-07-19
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2020-12-26
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多