NASM - Hello, World¶

2010

Hello, World [windows]¶

Cet extrait de code en assembleur affiche le message « Hello, World! » en utilisant une bibliothèque à liaison dynamique (pour la fonction _printf). Les arguments de la fonction _printf sont empilés sur la pile.

 global	_main
	extern	_printf
	extern _exit

	section .data

	message	db	'Hello, World', 10, 0

	section .text
 _main:
	push	message
	call	_printf

	xor eax, eax
	push eax
	call _exit

Au moment de l’édition de liens, libcrtdll.a est ajoutée, cette bibliothèque contient les fonctions _printf et _exit.

nasm -f win32 hellworld.asm
ld hellworld.o libcrtdll.a -o hellworld

Autrement, vous pouvez compiler en utilisant gcc au lieu de ld.

nasm -f win32 hellworld.asm
gcc hellworld.o

Bibliothèque statique et dynamique¶

Créer une bibliothèque¶

  • Écriture de la fonction myFunction en assembleur

; file : libHello.asm
BITS 64

section .data
  hello db \"Hello World !\", 0xa
  len equ $ - hello

section .text
  global      myFunction:function

  myFunction:
    mov rax, 4
    mov rbx, 1
    mov rcx, QWORD hello
    mov rdx, len
    int 0x80
    ret
  • Compiler la bibliothèque statiquement

nasm -f elf64 libHello.asm
ar rcs libHello.a libHello.o
  • Compiler la bibliothèque dynamique

nasm -f elf64 libHello.asm
ld -shared -o libHello.so libHello.o

Exemple d’utilisation de la bibliothèque¶

  • Code C utilisant une fonction de la bibliothèque

// file :  main.c
int main(int argc, char **argv) {
  myFunction();
  return 0;
}
  • Compiler avec la bibliothèque statique

gcc -static main.c -L. libHello.a -o statically_linked
  • Compiler avec la bibliothèque dynamique

gcc main.c -o dynamically_linked -L -l c_printf.so.1.0.1

Références¶