【问题标题】:Assembly Segment overlapping calculation装配段重叠计算
【发布时间】:2020-09-20 07:20:10
【问题描述】:

在汇编程序中,知道我所有段的值以及它们从哪里开始,我怎么知道它们是否相互重叠?
例如,在图像中,我有逻辑地址的值。每个段是否都有预定义的空间?或不?还有多少空间?

【问题讨论】:

  • 我假设这是实模式,否则段寄存器值不会是段基数,只是一个选择器。无论如何,即使在实模式下,段寄存器值也不会告诉您将源级段链接到的汇编器的偏移量,或者它们的大小。
  • 通常,每个段只占用所需的空间,最多 64k,16 字节的倍数。段是否“重叠”无关紧要 - 也就是说,您可能能够使用超出早期(内存中)段末尾的偏移量到达后续(内存中)段中的某些内容。跨度>

标签: assembly x86-16 segment real-mode memory-segmentation


【解决方案1】:

您的屏幕截图中的数字必须来自一个非常小的 .EXE。
您在程序中声明的段是有助于构建代码的逻辑细分。
在实地址模式下,CPU 看到的段是包含 65536 字节的内存块。这 65536 个字节相当于 4096 个 16 个字节的块,也就是段落。

下面,每个“x”代表 16 个字节。您可以看到示例中的各个部分之间存在大量重叠。

                   65280 bytes overlap between ES and CS
                <----------------------------------------->   
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ... xxxxxxx
^               xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ... xxxxxxxxxxxxxxxxxxxxxxx
ES              ^ xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ... xxxxxxxxxxxxxxxxxxxxxxxxx
               CS ^
                  DS/SS
                  <------------------------------------------------------->
                           65504 bytes overlap between CS and DS/SS

知道我所有细分的值以及它们从哪里开始,我如何知道它们是否相互重叠?

如果任何两个段寄存器中的值相差小于4096,那么它们之间就会有重叠。

  2F37h  DS
- 2F35h  CS
 ------
     2   Difference is less than 4096, so there's overlap

Overlap is 4096 - 2 = 4094 paragraphs (4094 * 16 = 65504 bytes)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2011-11-12
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多