Компилировать/выполнять ассемблер в Linux?

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

53
задан Mateusz Piotrowski 27 February 2017 в 14:31
поделиться

5 ответов

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

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

mnemonic    source, destination

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

mnemonic    destination, source

Любой из них, вероятно, сделает то, что вам нужно. GAS также имеет режим Intel-синтаксиса, который очень похож на MASM, а не на NASM.


Попробуйте этот учебник: http://asm.sourceforge.net/intro/Assembly-Intro.html

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

44
ответ дан 7 November 2019 в 08:22
поделиться

Ассемблер GNU, вероятно, уже установлен в вашей системе. Попробуйте man как , чтобы увидеть полную информацию об использовании. Вы можете использовать как для компиляции отдельных файлов и 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 put @ plt .

Исполняемый файл без PIE (зависящий от позиции ) может использовать 32-битную абсолютную адресацию для статических данных, но PIE должен использовать LEA, относящийся к RIP. (См. Также Разница между movq и movabsq в x86-64 , ни movq , ни movabsq не являются хорошим выбором.)

Если вы хотели написать 32- битовый код, соглашение о вызовах другое, и относительная адресация RIP недоступна. (Таким образом, вы должны нажать $ 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? для получения дополнительной информации о просмотре вывода компилятора и написании полезных небольших функций, которые будут компилироваться с получением интересного вывода.

57
ответ дан 7 November 2019 в 08:22
поделиться

Если вы используете 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

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

20
ответ дан 7 November 2019 в 08:22
поделиться

Ассемблер (GNU) - as(1)

4
ответ дан 7 November 2019 в 08:22
поделиться

Существует также 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
8
ответ дан 7 November 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: