Сборщик GNU, вероятно, уже установлен в вашей системе.Попробуйте man as
, чтобы увидеть полную информацию об использовании.Вы можете использовать as
для компиляции отдельных файлов и ld для ссылки, если вы действительно этого действительно хотите.
Тем не менее, GCC делает отличный интерфейс.Он может собрать .s файлы для вас.Например:
$ cat >hello.s <<"EOF"
.section .rodata # read-only static data
.globl hello
hello:
.string "Hello, world!" # zero-terminated C string
.text
.global main
main:
push %rbp
mov %rsp, %rbp # create a stack frame
mov $hello, %edi # put the address of hello into RDI
call puts # as the first arg for puts
mov $0, %eax # return value = 0. Normally xor %eax,%eax
leave # tear down the stack frame
ret # pop the return address off the stack into RIP
EOF
$ gcc hello.s -no-pie -o hello
$ ./hello
Hello, world!
Код выше x86-64.Если вы хотите сделать независимый от позиции исполняемый файл (PIE), вам понадобятся lea hello(%rip), %rdi
и call puts@plt
.
Неисполняемый PIE (позиция- зависит от ) можетиспользуйте 32-битную абсолютную адресацию для статических данных, но PIE должен использовать REA-относительный LEA.(См. Также Разница между movq и movabsq в x86-64 , ни movq
, ни movabsq
не являются хорошим выбором.)
Если вы хотите написать 32-битный код, вызывающийСоглашение другое, а относительная RIP-адресация недоступна.(Таким образом, вы должны push $hello
перед вызовом и получить аргументы стека после.)
Вы также можете скомпилировать код C / C ++ непосредственно в сборку, если вам интересно, как что-то работает:
$ cat >hello.c <<EOF
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
EOF
$ gcc -S hello.c -o hello.s
См. Также Как удалить "шум" из вывода сборки GCC / clang? для получения дополнительной информации о просмотре вывода компилятора и написании полезных небольших функций, которые будут компилироваться в интересный вывод.