как узнать байт-код для movq %rax, %rdi на osx?

Я просмотрел руководство ref.x86asm.net, и хотя в нем много информации, я не могу сделать из этого орел или решку, так как я не знаю, как интерпретировать регистры.

Я использую 64-битный код и имею соседнюю строку, в которой lldb показывает мне следующее:

48 89 e5 movq %rsp, %rbp

Из приведенного выше утверждения я знаю, что 89 — это команда перемещения. rsp — это источник, а rbp — пункт назначения (у меня osx).

в руководстве ref.86asm для «89» указано, что o имеет «r», а op1 имеет r / m16/32/64. op2 имеет r16/32/64 Я посмотрел значения, но действительно не понимаю, как все это должно работать. Я видел ссылки на REX в ответах других людей, но не знаю, что это значит.

XX 89 XX movq %rax, %rdi ; Как мне это сделать? Что такое ХХ?

Я пишу свой собственный байт-код и почти во всем разобрался, написав c, скомпилировав его, а затем просмотрев его в lldb. Однако я бы сэкономил много времени, если бы мог лучше понять, как на самом деле работают байтовые коды, когда они ссылаются на регистры.


person Div    schedule 11.08.2016    source источник
comment
Связанный вопрос объясняет, где в руководствах Intel можно найти документы для байта ModRM, который кодирует операнды src и dst. На самом деле он спрашивает об инструкции, которая использует поле /r в качестве дополнительных битов кода операции, в отличие от mov, но важным моментом является то, что ваш 3-й байт — это байт ModR/M, а первый байт — это префикс REX.   -  person Peter Cordes    schedule 12.08.2016
comment
Первый XX — это 48 =>, это префикс REX, указывающий, что инструкция работает с %rax, а не %eax. Без префикса REX 48 89 E5 будет декодироваться как movd %esp, %ebp. .. Второй XX - это байт ModR/M.   -  person Ped7g    schedule 12.08.2016
comment
эта статья может вам помочь.   -  person fuz    schedule 12.08.2016


Ответы (2)


Это относительно сложно определить вручную, поэтому, когда мне нужно это сделать, я пишу инструкцию в ассемблерном файле, собираю ее и проверяю результат. Лично я использую nasm.

Ваш файл будет выглядеть так (обратите внимание, что это синтаксис Intel, а не AT&T, как в вашем примере):

[BITS 64]
main:
    mov rdi, rax

С ума сойти, вы компилируете с помощью nasm file.asm -f bin -o output, а затем открываете output с помощью шестнадцатеричного редактора. (-f bin говорит nasm сделать плоский двоичный файл, то есть двоичный файл, представляющий собой просто необработанный машинный код.)

Насм — лишь один из многих. Keystone может быть проще для тестов с одной инструкцией. Кроме того, вы можете получить pwntools и использовать модуль asm.

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

person zneak    schedule 11.08.2016
comment
Я думаю, что OP не хочет просто определять это вручную, он хочет понимать, как это работает, и кодировать свой собственный [ограниченный?] ассемблер. По какой бы то ни было причине (может быть, образовательной). Ваш ярлык использования готового инструмента не очень помогает в таком случае. Также похоже, что он уже знает, как получить реальный байт-код какой-то инструкции, так как у него есть 48 89 e5 в вопросе. - person Ped7g; 12.08.2016

Вы можете использовать ассемблер (as) для определения байтов и использовать otool для их печати:

:; echo 'movq %rax, %rdi' | as
:; otool -tvj a.out
a.out:
(__TEXT,__text) section
0000000000000000    4889c7              movq    %rax, %rdi

Обратите внимание, что as по умолчанию записывает в файл a.out.

person rob mayoff    schedule 11.08.2016
comment
Я не думаю, что это полезно для ОП. У него уже есть вся информация, которую могут ему дать эти два инструмента. - person fuz; 12.08.2016