Это зависит от синтаксиса ассемблера. В основном у нас есть два варианта: Intel и AT & T синтаксис.
Существует несколько разновидностей синтаксиса Intel, основными из которых являются NASM (mov dword [symbol_name], 1
) и MASM (включая режим GAS .intel_syntax noprefix
, который могут использовать многие инструменты GNU и Unix.) Подробнее см. https://stackoverflow.com/tags/intel-syntax/info. различия и рассказывать их друг от друга.
Пример синтаксиса Intel (из разборки objdump, так что это GNU .intel_syntax
, с добавлением пары примеров):
push rbp # comment character can be # (GAS) or ; MASM/NASM
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov DWORD PTR [rbp-0x8],esi
mov edx,DWORD PTR [rbp-0x4]
mov eax,DWORD PTR [rbp-0x8]
add eax,edx
pop rbp
ret
add dword ptr [rdi], 1 # size specifier mandatory if neither operand is a reg
imul ecx, [rdi + rax*4 + 20], 12345
Существует только один вариант синтаксиса AT & T (https://stackoverflow.com/tags/att/info):
push %rbp # comment character is always #
mov %rsp,%rbp
mov %edi,-0x4(%rbp)
mov %esi,-0x8(%rbp)
mov -0x4(%rbp),%edx
mov -0x8(%rbp),%eax
add %edx,%eax
pop %rbp
retq
addl $1, (%rdi) # size suffix b/w/l/q used to indicate operand-size if neither operand is a register
# with more than 2 operands, reverse the whole list
imul $12345, 20(%rdi, %rax, 4), %ecx
Синтаксис AT & T является родным для систем Unix. Обычно декомпиляторы имеют флаги для управления типом синтаксиса вывода. Например, objdump
имеет флаг -Mintel
, GDB имеет параметр set disassembly-flavor intel
.
Кроме того, взгляните на этот полезный сайт, на котором вы можете быстро увидеть вывод ассемблера без шума Проводник компилятора
Обратите внимание, что синтаксис AT & T содержит ошибку проектирования для некоммутативных инструкций FP x87, таких как fsub
и fsubr
с операндами регистра: см. Руководство: https://sourceware.org/binutils/docs/as/i386_002dBugs.html