Linux использует указанный xI_86 ABI здесь . Лучшее, что вы можете сделать, это прочитать биты ABI, наиболее подходящие для вашего региона. Вот некоторые из них, которые приходят на ум:
- В отличие от x86, для x86_64 существует только одно соглашение о вызовах; два, если учесть тот факт, что Microsoft Windows снова совершенно другая.
- В x86 аргументы функций обычно передаются в стек. в x86_64 первые несколько находятся в регистрах
rdi
, rsi
, rdx
, rcx
, r8
и r9
для целочисленных типов.
- Все типы адресов памяти
QWORD
, поэтому, если вы используете полные регистры (r10
и т. Д.) С синтаксисом AT & T, вам понадобятся movq
, addq
и т. Д.
Теперь частью дизайна x86_64
было то, что он был обратно совместим с x86
, то есть мог выполнять код x86
, если операционная система настроена правильно. Таким образом, нет ничего плохого в том, например, сделать это:
nasm -felf32 myprog.asm
gcc -o myprog -m32 myprog.o
Однако имейте в виду; чем больше вы начинаете полагаться на доступность другого кода, тем больше вам нужно 32-битных копий всего. Обратите внимание, что это в основном использует код в 32-битном режиме полностью, в комплекте с соглашением о вызовах и всем прочим. Короче говоря, он должен выполняться и на 32-битной машине. Как говорит Джерри (+1), вы не можете скомпилировать 32-битную сборку, используя 32-битные соглашения в 64-битном режиме. Вы должны соблюдать 64-битный ABI.
Конечно, кроме этого, вы можете свободно использовать в своих подпрограммах такие регистры, как eax
, просто имейте в виду, что это влияет на весь rax
или, точнее, на половину, которая `eax.