Скомпилировать / запустить ассемблер в Linux?

46

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

  • 0
    Я в одной лодке. Я никогда не воспринимал asm в Linux, потому что там нет настоящего присутствия. Может быть, это потому, что взлом на Windows все в моде.
  • 0
    Это не полностью отвечает на мой вопрос. Я все еще хочу знать, какие консольные команды вы бы использовали для компиляции и запуска программ в NASM или газе
Показать ещё 1 комментарий
Теги:
assembly
x86

7 ответов

42
Лучший ответ

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

Газ

использует синтаксис AT & T:

mnemonic    source, destination

nasm использует стиль intel:

mnemonic    destination, source

Возможно, кто-то сделает то, что вам нужно.

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

  • 1
    Спасибо, этот урок великолепен, так как он специфичен для Linux. Кроме того, в руководстве были очень конкретные инструкции по компиляции и запуску ассемблерных прог в Linux.
  • 1
    gas уже некоторое время поддерживает ".intel_syntax" - хотя я лично все равно буду использовать fasm, yasm или nasm.
42

Ассемблер GNU, вероятно, уже установлен в вашей системе. Попробуйте man as просмотреть полную информацию об использовании. Вы можете использовать as для компиляции отдельных файлов и ld для ссылки, если вы действительно этого хотите.

Однако GCC делает отличный интерфейс. Он может собирать файлы .s для вас. Например:

$ cat >hello.s <<EOF
.data
.globl hello
hello:
.string "Hello, world!"

.text
.global main
main:
    pushq   %rbp
    movq    %rsp,       %rbp
    movq    $hello,     %rdi
    call    puts
    movq    $0,         %rax
    leave
    ret
EOF
$ gcc hello.s -o hello
$ ./hello
Hello, world!

Код выше - AMD64. Было бы иначе, если вы все еще на 32-битной машине.

Вы также можете скомпилировать код 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
17

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

nasm file.asm -o outfile

где 'file.asm' - ваш файл сборки (код) и 'outfile' - это исполняемый файл, который вы хотите.

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

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

Существует также 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
6

Мое предложение состояло в том, чтобы получить книгу "Программирование с нуля":

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

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

3

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

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

3

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню