używany tylko do sekcji danych. Mimo, iż FASM zaakceptuje atrybut writeable dla sekcji kodu, nie powinniśmy go tam umieszczać. Zapisanie czegokolwiek do sekcji kodu może skończyć się błędem naruszenia ochrony pamięci (segmentation fault). Można jednak w tym segmencie umieszczać dane. Ale należy to robić tak, aby nie stały się one częścią programu, zwykle wpisuje się je za ostatnią komendą kończącą program. Procesor przecież nie wie, co jest pod danym adresem i z miłą chęcią potraktuje to coś jako instrukcję, co może prowadzić do przykrych konsekwencji. Swoje dane umieszczajcie tak, aby w żaden sposób strumień wykonywanych instrukcji nie wszedł na nie. Dane będziemy więc zazwyczaj umieszczać w oddzielnej sekcji.
• (NASM) section .text
Wskazuje początek segmentu, gdzie znajduje się kod programu. Można jednak w tym segmencie umieszczać dane. Ale należy to robić tak, aby nie stały się one częścią programu, zwykle wpisuje się je za ostatnią komendą kończącą program. Procesor przecież nie wie, co jest pod danym adresem i z miłą chęcią potraktuje to coś jako instrukcję, co może prowadzić do przykrych konsekwencji. Swoje dane umieszczajcie tak, aby w żaden sposób strumień wykonywanych instrukcji nie wszedł na nie. Zapisanie czegokolwiek do sekcji kodu może skończyć się błędem naruszenia ochrony pamięci (segmentation fault), dlatego dane będziemy zazwyczaj umieszczać w oddzielnej sekcji.
• (NASM) global _start
Sprawiamy, że nazwa _start będzie widziana poza tym programem (konkretnie to przez linker ld, który skompilowaną wersję programu przerobi na wersję wykonywalną).
• _start: (z dwukropkiem)
Etykieta określająca początek programu.
• mov eax, 4/mov rax, 1
Do rejestru EAX (32-bitowy) lub RAX (64-bitowy) wstaw (MOV = move, przesuń) wartość 4 (1 na systemach x86-64). Jest to numer funkcji systemu Linux, którą chcemy uruchomić. Jeśli chcemy skorzystać z funkcji systemowych, to zawsze EAX zawiera numer takiej funkcji.
Numery funkcji różnią się na różnych architekturach procesorów. Poczytajcie mój spis funkcji
Komenda MOV ma 3 ważne ograniczenia:
1. nie można skopiować jedną komendą MOV komórki pamięci do innej komórki pamięci, takie coś:
mov [a], [b]
(gdzie a i b - dwie zmienne w pamięci) jest zabronione.
O tym, co oznaczają nawiasy kwadratowe, czyli o adresowaniu zmiennych w pamięci -następnym razem.
2. nie można skopiować jedną komendą MOV jednego rejestru segmentowego (cs,ds,es,ss,fs,gs) do innego rejestru segmentowego, czyli taka operacja
17