дизассемблеры будут декодировать все инструкции обратно в asm. Некоторые сгруппируют байты в префиксы, код операции и более поздние данные . например, 4-байтовое немедленное или смещение в режиме адресации может быть сгруппировано без пробелов, но отделено от кода операции пробелом.
Это делает дизассемблер Agner Fog objconv. https://www.agner.org/optimize/#objconv
например, в случайном файле .o
, который я обнаружил в недавнем вопросе SO о флагах x87. Обратите внимание, что это .o
, поэтому адреса основаны на 0
в каждом разделе.
Что более важно, не то, как машинный код fld dword [value1]
отображается как D9
(код операции), 05
(байт ModRM, который кодирует режим адресации и в этом случае сигнализирует о смещении на 4 байта), и 00000000
с примечанием (d), показывающим 4-байтовый disp32
.
;; Produced with
;; objconv -fnasm fcomtest.o /dev/stdout
global _start
SECTION .text align=1 execute ; section number 1, code
_start: ; Function begin
fld dword [value1] ; 0000 _ D9. 05, 00000000(d)
fcom dword [value2] ; 0006 _ D8. 15, 00000004(d)
fwait ; 000C _ 9B
fnstsw ax ; 000D _ DF. E0
pushfd ; 000F _ 9C
sahf ; 0010 _ 9E
pushfd ; 0011 _ 9C
ja greater ; 0012 _ 77, 0E
jc lessthan ; 0014 _ 72, 18
mov eax, 1 ; 0016 _ B8, 00000001
mov ebx, 0 ; 001B _ BB, 00000000
int -128 ; 0020 _ CD, 80
greater:mov eax, 1 ; 0022 _ B8, 00000001
mov ebx, 2 ; 0027 _ BB, 00000002
int -128 ; 002C _ CD, 80
lessthan:
mov eax, 1 ; 002E _ B8, 00000001
mov ebx, 1 ; 0033 _ BB, 00000001
; Note: Function does not end with ret or jmp
int -128 ; 0038 _ CD, 80
; _start End of function
SECTION .data align=1 noexecute ; section number 2, data
value1: ; dword
dd 412EC49CH ; 0000 _ 10.923
value2: dd 4091B3D0H ; 0004 _ 4.5531998
Вероятно, есть способ запустить objconv
на порции сырых байтов, а не в .o
, или, если нет, вы можете поместить его в один.
Общая структура машинного кода x86 довольно фиксирована:
[prefixes ...] opcode [modrm [sib] [disp0/8/32]] [imm8/16/32]
Некоторые коды операций не имеют модема (например, mov reg, imm32
), многие не имеют немедленного (например, add r32, r/m32
), некоторые имеют оба (например, add r/m32, imm8
), некоторые не имеют ни одного (например, lodsb
или cdq
).
см. http://ref.x86asm.net/coder64.html для карты кода операции. И, конечно, руководства Intel (которые индексируются mnemoni c, а не кодом операции), например, HTML extract https://www.felixcloutier.com/x86/
IDK, если кто-то создал такой онлайн-инструмент, как вы изображения или другие дизассемблеры, которые делают то, что делает objconv.