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

Jiw*_*won 0 debugging x86 assembly segment

我得到了一些不一致的教学结果.
我不知道为什么会这样,所以我怀疑%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)
Run Code Online (Sandbox Code Playgroud)


结果1:

%eax : 0x11111111 
Run Code Online (Sandbox Code Playgroud)

看到这个结果,我猜想 mov %es:(%edi),%eax有点像mov (%edi),%eax.
因为0x11111111存储在HERE.


结果2:

%eax : 0x048410cc  
Run Code Online (Sandbox Code Playgroud)

但是,结果2的结果完全不同.
我假设%eax是0x048410bf,因为这个值存储在main.
但结果却不同,你可以看到.


问题:
为什么结果不一致?
顺便说一下,%es在执行两条指令时,值总是为0x7b.

Jes*_*ter 6

es是一只红鲱鱼.您看到的差异是1个字节at main,ccvs bf. 那是因为您使用了一个软件断点,main并且您的调试器插入了一条int3指令,该指令的机器代码会cc暂时覆盖您的实际代码.

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