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
.globalglobl _start
_start:
movl $4, %eax
Linia 20:
.data
napis:
.string "helloHello worldWorld!\n10"
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
.globalglobl _start
</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
inclmovl $1, %ebx
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. Instrukcja inc zwiększa wartość rejestru o 1. Instrukcja int powoduje wywołanie przerwania i realizację przez system operacyjny odpowiedniej czynności - w tym przypadku wypisanie na ekran "Hello worldWorld!".
<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 "helloHello worldWorld!\n10"
</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!\n13\10$"
.text
.globl _start