<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS83dW9kVy5wbmcifQ==” alt =“每个段的指针值”>
在Assembly程序中,知道我所有段的值以及它们的起点,我如何知道它们是否相互重叠?例如,在图像中,我具有逻辑地址的值。每个段都有预定的空间吗?或不?还有多少空间?
屏幕快照中的数字必须来自非常小的.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)