Asembler x86/Pierwszy program/GNU AS: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Przemub (dyskusja | edycje)
m rewert - błędny kod asemblera
Nie podano opisu zmian
Linia 4:
=== Hello world! (POSIX) ===
Oto przykład programu, napisanego w asemblerze GNU, wyświetlającego napis "Hello World!" w systemie zgodnym z normą POSIX, uruchomionym na komputerze typu i386:
<sourcesyntaxhighlight lang="asm">
.text
.global _start
Linia 22:
.string "hello world!\n"
len = . - napis
</syntaxhighlight>
</source>
 
Aby skompilować powyższy program musisz wydać następujące polecenia. Najpierw trzeba kod zasemblować aby uzyskać plik obiektowy '''*.o''':
Linia 38:
_start:
"Zawartość" etykiety _start.
<sourcesyntaxhighlight lang="asm">
movl $4, %eax
movl $1, %ebx
Linia 44:
movl $len, %edx
int $0x80
</syntaxhighlight>
</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), EBX - plik docelowy (1 - standardowe wyjście), w ECX - adres, pod którym znajdują się dane do wyświetlenia oraz EDX - długość napisu. Instrukcja int powoduje wywołanie przerwania i realizację przez system operacyjny odpowiedniej czynności - w tym przypadku wypisanie na ekran "Hello world!".
<sourcesyntaxhighlight lang="asm">
movl $1, %eax
movl $0, %ebx
int $0x80
</syntaxhighlight>
</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.
.data
Linia 56:
napis:
Nie używamy .globl - etykieta napis ma być widoczna tylko dla kodu programu i nie jest istotna w procesie tworzenia pliku wykonywalnego.
<sourcesyntaxhighlight lang="asm">
.string "hello world!\n"
</syntaxhighlight>
</source>
Tworzymy napis, który będzie widoczny pod adresem etykiety "napis".
 
Linia 67:
=== Hello World! (wersja DOS) ===
Analogiczny program, który kompiluje się pod systemem DOS(będąc emulowanym pod Windowsem) mógłby wyglądać np. tak:
<sourcesyntaxhighlight lang="asm">
.data
napis:
Linia 79:
movw $0x4C00, %ax
int $0x21
</syntaxhighlight>
</source>
Przyglądając się składni GNU możesz zauważyć, jak bardzo różni się ona od składni NASM lub MASM.