我得到了一些不一致的教学结果。
我不知道为什么会这样,所以我怀疑%es
注册做了一些奇怪的事,但我不确定。
请看下面的代码段。
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
暂时覆盖了你的实际代码。
不要在打算读取的位置设置断点,也不要使用不修改代码的硬件断点。