x86-64 порядок сборки операндов - PullRequest
0 голосов
/ 19 января 2019

Каков порядок операндов в сборке x86-64 ?: место назначения инструкции, источник Или: источник инструкции, место назначения

У меня три книги и два разных подхода!

1 Ответ

0 голосов
/ 19 января 2019

Это зависит от синтаксиса ассемблера. В основном у нас есть два варианта: 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

...