Скомпилировать / запустить ассемблер в Linux? - PullRequest
53 голосов
/ 23 июля 2010

Я довольно новичок в Linux (Ubuntu 10.04) и начинающий ассемблер.Я следовал некоторым учебникам, и я не мог найти что-то конкретное для Linux.Итак, мой вопрос: что такое хороший пакет для компиляции / запуска ассемблера и какие команды командной строки для компиляции / запуска для этого пакета?

Ответы [ 8 ]

57 голосов
/ 23 июля 2010

Сборщик 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? для получения дополнительной информации о просмотре вывода компилятора и написании полезных небольших функций, которые будут компилироваться в интересный вывод.

43 голосов
/ 23 июля 2010

GNU ассемблер (газ) и NASM - хороший выбор.Тем не менее, они имеют некоторые различия, главным из которых является порядок операций и их операнды.

gas использует синтаксис AT & T (руководство: https://stackoverflow.com/tags/att/info):

mnemonic    source, destination

nasm использует стиль Intel (guide: https://stackoverflow.com/tags/intel-syntax/info):

mnemonic    destination, source

Любой из них, вероятно, будет делать то, что вам нужно. GAS также имеет режим синтаксиса Intel, который во многом похож на MASM, а не NASM.* Попробуйте этот урок: http://asm.sourceforge.net/intro/Assembly-Intro.html

См. Также дополнительные ссылки на руководства и документы в вики-теге Stack Overflow x86

20 голосов
/ 23 июля 2010

Если вы используете NASM, командной строкой будет просто

nasm -felf32 -g -Fdwarf file.asm -o file.o

, где 'file.asm' - это ваш файл сборки (код), а 'file.o' - это объектный файл, который вы можете связатьс gcc -m32 или ld -melf_i386.(Сборка с nasm -felf64 создаст 64-битный объектный файл, но в приведенном ниже примере hello world используются 32-битные системные вызовы, и он не будет работать в исполняемом файле PIE.)

Вот еще некоторая информация:

http://www.nasm.us/doc/nasmdoc2.html#section-2.1

Вы можете установить NASM в Ubuntu с помощью следующей команды:

apt-get install nasm

Вот базовая сборка Hello World в Linux для возбуждения вашего аппетита:

http://web.archive.org/web/20120822144129/http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html

Надеюсь, это то, что вы спрашивали ...

8 голосов
/ 18 августа 2010

Существует также FASM для Linux.

format ELF executable

segment readable executable

start:
mov eax, 4
mov ebx, 1
mov ecx, hello_msg
mov edx, hello_size
int 80h

mov eax, 1
mov ebx, 0
int 80h

segment readable writeable

hello_msg db "Hello World!",10,0
hello_size = $-hello_msg

Он компилируется с

fasm hello.asm hello
7 голосов
/ 29 сентября 2010

Я бы посоветовал получить книгу «Программирование с нуля»:

http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf

Это очень хорошая отправная точка для знакомства с программированием на ассемблере в Linux и многое объясняетиз основ, которые вы должны понять, чтобы начать.

4 голосов
/ 21 октября 2010

3 синтаксиса (nasm, tasm, gas) в 1 ассемблере, yasm.

http://www.tortall.net/projects/yasm/

4 голосов
/ 23 июля 2010

Ассемблер (GNU) равен как (1)

1 голос
/ 15 ноября 2018

Для Ubuntu 18.04 установить nasm.Откройте терминал и введите:

sudo apt install as31 nasm

nasm документы

Для компиляции и запуска:

nasm -f elf64 example.asm # assemble the program  
ld -s -o example example.o # link the object file nasm produced into an executable file  
./example # example is an executable file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...