为什么我在加载附近的代码字节时会收到意外的“0xcc”字节?是因为段寄存器%es吗?

Why am I getting an unexpected `0xcc` byte when loading nearby code bytes? Is it because of segment register %es?

我得到了一些不一致的指令结果。
我不知道为什么会这样,所以我怀疑 %es register 做了一些奇怪的事情,但我不确定。

请看下面的代码片段。

08048400 <main>:
 8048400:   bf 10 84 04 08          mov    $HERE,%edi     
 8048405:   26 8b 07                mov    %es:(%edi),%eax  # <----- Result 1
 8048408:   bf 00 84 04 08          mov    $main,%edi
 804840d:   26 8b 07                mov    %es:(%edi),%eax  # <----- Result 2

08048410 <HERE>:
 8048410:   11 11                   adc    %edx,(%ecx)
 8048412:   11 11                   adc    %edx,(%ecx)


结果 1:

%eax : 0x11111111 

看到这个结果,我猜mov %es:(%edi),%eax应该是mov (%edi),%eax
因为 0x11111111 存储在 HERE


结果2:

%eax : 0x048410cc  

然而,结果 2 的结果却大不相同。
我假定 %eax 为 0x048410bf,因为该值存储在 main.
但如您所见,结果有所不同。


问题:
为什么会出现这种结果不一致的情况?
顺便说一句,%es 的值在两条指令的执行期间始终为 0x7b。

es 是一个转移注意力的问题。您看到的差异是 mainccbf 处的 1 个字节。那是因为您在 main 处使用了一个软件断点,并且您的调试器插入了一条 int3 指令,该指令的机器代码 cc 暂时覆盖了您的实际代码。

不要在要读取的地方设置断点,或者使用不修改代码的硬件断点。