Assembly 装配段重叠计算

Assembly 装配段重叠计算,assembly,x86-16,segment,real-mode,memory-segmentation,Assembly,X86 16,Segment,Real Mode,Memory Segmentation,在汇编程序中,如果知道所有段的值及其起始位置,如何知道它们是否相互重叠?例如,在图像中,我有逻辑地址的值。每个段是否都有一个预定义的空间?还是不?还有多少空间?屏幕截图中的数字必须来自一个非常小的.EXE。 您在程序中声明的段是有助于构建代码结构的逻辑细分。 在实地址模式下,CPU看到的段是包含65536字节的内存块。这65536字节相当于4096块16字节的段落 下面,每个“x”代表16个字节。您可以看到,在您的示例中,片段之间存在巨大的重叠 65280


在汇编程序中,如果知道所有段的值及其起始位置,如何知道它们是否相互重叠?
例如,在图像中,我有逻辑地址的值。每个段是否都有一个预定义的空间?还是不?还有多少空间?

屏幕截图中的数字必须来自一个非常小的.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

我假设这是实模式,否则段寄存器值不是段基,只是一个选择器。无论如何,即使在实模式下,段寄存器值也不会告诉您汇编器将源代码级段链接到哪个偏移量,或者它们的大小。通常,每个段只占用它所需的空间,最多64k,16字节的倍数。这些段是否“重叠”并不重要——也就是说,您可能能够使用超出先前(内存中)段末尾的偏移量在后续(内存中)段中访问某些内容。
  2F37h  DS
- 2F35h  CS
 ------
     2   Difference is less than 4096, so there's overlap

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