装配体重叠计算

问题描述 投票:1回答:1

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS83dW9kVy5wbmcifQ==” alt =“每个段的指针值”>

在Assembly程序中,知道我所有段的值以及它们的起点,我如何知道它们是否相互重叠?例如,在图像中,我具有逻辑地址的值。每个段都有预定的空间吗?或不?还有多少空间?

assembly x86-16 segment real-mode memory-segmentation
1个回答
0
投票

屏幕快照中的数字必须来自非常小的.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)
© www.soinside.com 2019 - 2024. All rights reserved.