X86 Assembly Hello World

Da Andreabont's Wiki.

Questo esempio è scritto in sintassi AT&T ed è pensato per essere assemblato e linkato su una piattaforma linux x86.

Codice

Versione con interrupt

.global _start

.text
_start:                         # Punto di ingresso
        movl  $4, %eax          # Selezione chiamata di sistema (sys_write)
        movl  $1, %ebx          # Selezione file descriptor (stdout)
        movl  $msg, %ecx        # Passo stringa
        movl  $len, %edx        # Passo lunghezza stringa
        int   $0x80             # Chiamo il kernel (Interrupt 0x80)

        movl  $1, %eax          # Selezione chiamata di sistema (sys_exit)
        movl  $0, %ebx          # Passo codice di uscita
        int   $0x80             # Chiamo il kernel (Interrupt 0x80)
.data
msg:
        .ascii  "Hello, world!\n"
        len =   . - msg

Versione con syscall (X86_64)

.global _start

.text
_start:                         # Punto di ingresso
        movq  $1, %rax          # Selezione chiamata di sistema (sys_write)
        movq  $1, %rdi          # Selezione file descriptor (stdout)
        movq  $msg, %rsi        # Passo stringa
        movq  $len, %rdx        # Passo lunghezza stringa
        syscall                 # Chiamo il kernel

        movq  $60, %rax          # Selezione chiamata di sistema (sys_exit)
        movq  $0, %rdi          # Passo codice di uscita
        syscall                 # Chiamo il kernel
.data
msg:
        .ascii  "Hello, world!\n"
        len =   . - msg

Compilazione

Assemblaggio

Questo passaggio genera un file oggetto.

as <file.s> -o <file.o>

Linking

Questo passaggio effettua il linking di un file oggetto e genera un eseguibile ELF.

ld <file.o> -o <eseguibile>