Program hello world (Pokaż/ukryj kod)
; wersja NASM na system 64-bitowy (x86-64) ; kompilacja: nasm -felf64 hello64.asm -o hello64.o ; linkowanie: ld hello64.o -o hello64 bits 64 section .text ; początek sekcji kodu. global _start ; linux rozpoczyna wykonywanie programu od etykiety _start ; musi ona być widoczna na zewnątrz (global) _start: ; punkt startu programu mov rax, 1 ; numer funkcji systemowej: ; sys_write - zapisz do pliku mov rdi, 1 ; numer pliku, do którego piszemy. ; 1 = standardowe wyjście = ekran mov rsi, tekst ; RSI = adres (offset) tekstu mov rdx, dlugosc ; RDX = długość tekstu syscall ; wywołujemy funkcję systemową mov rax, 60 ; numer funkcji systemowej ; (sys_exit - wyjdź z programu) syscall ; wywołujemy funkcję systemową section .data ; początek sekcji danych. tekst db "Czesc", 0ah ; nasz napis, który wyświetlimy dlugosc equ $ - tekst ; długość napisu
objdump -x hello64
Nagłówki w pliku wykonywalnym
hello64: file format elf64-x86-64
hello64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000000004000b0
Program Header:
LOAD off 0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
filesz 0x00000000000000d2 memsz 0x00000000000000d2 flags r-x
LOAD off 0x00000000000000d4 vaddr 0x00000000006000d4 paddr 0x00000000006000d4 align 2**21
filesz 0x0000000000000006 memsz 0x0000000000000006 flags rw-
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000022 00000000004000b0 00000000004000b0 000000b0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000006 00000000006000d4 00000000006000d4 000000d4 2**2
CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
00000000004000b0 l d .text 0000000000000000 .text
00000000006000d4 l d .data 0000000000000000 .data
0000000000000000 l df *ABS* 0000000000000000 hello64.asm
00000000006000d4 l .data 0000000000000000 tekst
0000000000000006 l *ABS* 0000000000000000 dlugosc
0000000000000000 l df *ABS* 0000000000000000
00000000006000d8 l O .data 0000000000000000 _GLOBAL_OFFSET_TABLE_
00000000004000b0 g .text 0000000000000000 _start
00000000006000da g .data 0000000000000000 __bss_start
00000000006000da g .data 0000000000000000 _edata
00000000006000e0 g .data 0000000000000000 _end
Odwołania do funkcji zewnętrznych odbywa się przy pomocy procedure linkage table (PLT)
CALL printf WRT ..plt