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

问题描述 投票:0回答:1

我得到了一些不一致的教学结果。 我不知道为什么会这样,所以我怀疑%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。

debugging assembly x86 segment
1个回答
6
投票

es是一只红鲱鱼。你看到的差异是mainccbf的1个字节。那是因为你在main上使用了一个软件断点,你的调试器插入了一个int3指令,该指令的机器代码cc暂时覆盖了你的实际代码。

不要在打算读取的位置设置断点,也不要使用不修改代码的硬件断点。

© www.soinside.com 2019 - 2024. All rights reserved.