Почему я получаю неожиданный байт `0xcc` при загрузке соседних байтов кода?Это из-за сегментного регистра% es? - PullRequest
0 голосов
/ 07 февраля 2019

Я получил какой-то непоследовательный результат инструкции.
Я не знаю, почему это происходит, поэтому я подозреваю, что регистр %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 во время выполнения обеих инструкций.

1 Ответ

0 голосов
/ 07 февраля 2019

es - красная сельдь.Разница, которую вы видите, составляет 1 байт при main, cc против bf.Это связано с тем, что вы использовали программную точку останова на main, а ваш отладчик вставил инструкцию int3 с машинным кодом cc, временно перезаписывающую ваш фактический код.

Не устанавливайте точку останова, на которой вы собираетесь читатьот или используйте аппаратную точку останова, которая не изменяет код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...