27.05.2010
section .data ; początek sekcji danych.
tekst db "Czesc", Oah ; nasz napis, który wyświetlimy
dlugosc equ $ - tekst ; długość napisu
I w końcu program 64-bitowy dla FASMa:
; wersja FASM na system 64-bitowy (x86-64)
format ELF64 executable |
; typ pliku | |
entry _start |
; punkt startu programu | |
segment readable |
executable |
; początek sekcji kodu |
_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ą | |
segment readable |
writeable |
; początek sekcji danych. |
tekst db |
'Czesc", Oah |
; nasz napis, który wyświetlimy |
dlugosc dq |
$ - tekst |
; długość napisu w trybie 64-bitowym |
Bez paniki! Teraz omówimy dokładnie, co każda linia robi.
• linie lub napisy zaczynające się średnikiem.
Traktowane są jako komentarze i są całkowicie ignorowane przy kompilacji. Rozmiar skompilowanego programu wynikowego nie zależy od ilości komentarzy. Dlatego najlepiej wstawiać tyle komentarzy, aby inni (również my) mogli później zrozumieć nasz kod.
• (FASM)format ELF executable/format ELF64 executable
Określa format (typ) pliku wyjściowego: wykonywalny plik ELF (format używany w Linuksie). FASM nie potrzebuje programów łączących, aby utworzyć program. Format ELF64 jest używany oczywiście pod systemem 64-bitowym.
• (FASM) entry _start
Określa, gdzie program się zaczyna. Po uruchomieniu programu procesor zaczyna wykonywać komendy zaczynające się pod podaną tutaj etykietą (_start) znajdującą się w sekcji kodu.
• (FASM)segment readable executable
Określa nowy segment programu - segment kodu, któremu ustawiamy odpowiednie atrybuty: do odczytu i do wykonywania. Innym atrybutem jest writeable (do zapisu), który powinien być
16