为什么我在加载附近的代码字节时会收到意外的“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
是一个转移注意力的问题。您看到的差异是 main
、cc
与 bf
处的 1 个字节。那是因为您在 main
处使用了一个软件断点,并且您的调试器插入了一条 int3
指令,该指令的机器代码 cc
暂时覆盖了您的实际代码。
不要在要读取的地方设置断点,或者使用不修改代码的硬件断点。
我得到了一些不一致的指令结果。
我不知道为什么会这样,所以我怀疑 %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
是一个转移注意力的问题。您看到的差异是 main
、cc
与 bf
处的 1 个字节。那是因为您在 main
处使用了一个软件断点,并且您的调试器插入了一条 int3
指令,该指令的机器代码 cc
暂时覆盖了您的实际代码。
不要在要读取的地方设置断点,或者使用不修改代码的硬件断点。