Asembler x86/Pierwszy program/GNU AS: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m poprawa linków do podstron podręcznika Asembler x86 z powodu zmiany nazwy |
poprawki |
||
Linia 6:
<source lang="asm">
.text
.
_start:
movl $4, %eax
Linia 20:
.data
napis:
.string "
len = . - napis
</source>
Aby skompilować powyższy program musisz wydać następujące polecenia. Najpierw trzeba kod zasemblować aby uzyskać plik obiektowy '''*.o''':
<source lang="bash">
as hello.s -o hello.o
</source>
Tak otrzymany kod wynikowy, musisz poddać działaniu linkera '''ld''':
<source lang="bash">
ld hello.o -o hello
chmod +x hello
</source>
Teraz dopiero program jest wykonywalny. Możesz go uruchomić w konsoli wydając polecenie w katalogu w którym jest program:
<source lang="bash">
./hello
</source>
Omówię teraz po kolei kod tego programu:
<source lang="asm">
.text
.
</source>
Ten fragment informuje asembler, że informacje tutaj zawarte są kodem programu, a etykieta _start ma być etykietą globalną (umożliwi to m.in. wykorzystanie tej etykiety jako głównej funkcji programu).
<source lang="asm">
_start:
</source>
"Zawartość" etykiety _start.
<source lang="asm">
movl $4, %eax
movl $napis, %ecx
movl $len, %edx
int $80h
</source>
Instrukcja mov (l na końcu to informacja, że zapisujemy dane do 32-bitowego rejestru) przenosi dane do odpowiednich rejestrów - w EAX znajdzie się numer funkcji systemowej (4 - write), w ECX - adres, pod którym znajdują się dane do wyświetlenia oraz EDX - długość napisu
<source lang="asm">
movl $1, %eax
Linia 52 ⟶ 61:
</source>
Tym razem wywołamy funkcję exit, której argumentem będzie 0. W ten sposób "poprosimy" system operacyjny o zakończenie pracy programu.
<source lang="asm">
.data
</source>
Oznacza, że dalsza część programu będą stanowiły dane, potrzebne do wykonania instrukcji.
<source lang="asm">
napis:
</source>
Nie używamy .globl - etykieta napis ma być widoczna tylko dla kodu programu i nie jest istotna w procesie tworzenia pliku wykonywalnego.
<source lang="asm">
.string "
</source>
Tworzymy napis, który będzie widoczny pod adresem etykiety "napis".
<source lang="asm">
len = . - napis
</source>
Jest to zmienna, która zawiera długość napisu. Kropka oznacza "aktualny adres" w pamięci (w naszym przypadku koniec napisu), a "napis" - adres etykiety, pod którą zawarto początek napisu. Różnica koniec - początek daje długość napisu, która jest niezbędna, aby program wypisał na ekranie dokładnie tyle znaków, ile liczy sobie napis.
Linia 70 ⟶ 83:
.data
napis:
.string "Hello World!\
.text
.globl _start
|