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)