как получить шестнадцатеричный код инструкции в x86?

section .data

section .text

global _start


_start:
    mov eax, loop ; eax <- addr of loop
    mov ebx, new
    mov ecx, new   
    mov esi, 2
loop:
    mov edx, [eax] ; edx <- instruction of loop, but not worked
    mov [ebx], edx 
    add eax, esi
    add ebx, esi
    cmp eax, ecx
    jne loop
    mov ecx, ebx
new:

картинка кода x86

Что я хочу в этом коде, так это поместить шестнадцатеричный код инструкции цикла в edx.

Если вы видите здесь, mov edx и [eax] сохраняются в цикле, и я думаю, что код инструкции 0x1389108b, но фактическое сохраненное значение — 0x13cc10cc. Я не знаю, как получить это значение 0x1389108b.


person 김상엽    schedule 27.05.2020    source источник


Ответы (1)


Инструкция в loop — это 8b 10, а следующая инструкция — 89 13. Однако вы установили точку останова в каждой из этих инструкций, поэтому отладчик перезаписал первый байт каждой инструкции инструкцией точки останова. Код для точки останова — cc, так что это то, что читает ваша программа. Если вы запустите его без установки точек останова, вы получите ожидаемое значение.

person prl    schedule 27.05.2020
comment
GDB имеет hbreak для использования точки останова с помощью аппаратного обеспечения (регистры отладки вместо 0xcc), что также может избежать этого. Я думаю, что на SO есть дубликат другого вопроса о нагрузках, видящих 0xcc ... Да, нашел один, где Jester упомянул hbreak в ответе. И оказывается, что существует несколько дубликатов отладчика Visual Studio. - person Peter Cordes; 27.05.2020