Asembler x86/Pierwszy program/NASM: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
mNie podano opisu zmian |
|||
Linia 1:
=== Hello World! ===
Zacznijmy od dawki kodu,
<source lang="asm">
segment dane
Linia 22:
end
</source>
Program ten po uruchomieniu w konsoli wyświetla na ekranie tekst "Hello World!". Postaram się zrozumiale wyjaśnić, o co w nim chodzi.
<source lang="asm">segment dane</source>
Oznacza, że od tego miejsca w dół definiowany jest nowy segment o nazwie "dane".
<source lang="asm">tekst db "Hello World!",0Ah,0Dh,"$"</source>
Ta linijka dodaje zmienną do obecnie definiowanego segmentu (w tym przypadku chodzi o segment "dane"). ''tekst'' to nazwa naszej zmiennej, ''db'' to typ naszej zmiennej (db - 1 bajt), zaś wszystko, co znajduje się dalej w tej linijce to wartość początkowa dla naszej zmiennej. Jak widać, jest to ciąg znaków zakończony znakami 0A0D (określające przejście do nowej linii) oraz znakiem $ oznaczającym koniec naszego ciągu (dla migrantów z C/C++ - jest to odpowiednik znaku '\0'). Gdyby zabrakło tego znaku, instrukcje operujące na naszej zmiennej
<source lang="asm">segment stosik stack</source>
Tworzy segment stosu (''stack'') o nazwie ''stosik'' i...
<source lang="asm">resb 64</source>
Linia 39:
..start:
Nazywa obecną pozycję słówkiem "start". Poprzedzenie ''start:'' dwoma kropkami oznacza, że chcemy, aby to miejsce było początkiem naszego programu.
<source lang="asm">
Linia 47:
mov ss, ax
</source>
Instrukcja [[Asembler X86/Instrukcje/Transferowe#mov|mov]] kopiuje wartość drugiego parametru do pierwszego. Jako, że po starcie programu
<source lang="asm">
Linia 54:
int 0x21
</source>
Ten fragment kodu zacznę tłumaczyć od końca. Instrukcja [[../Instrukcje/Różne#int|int]] wywołuje ''podprogram obsługi przerwania'' o podanym numerze (poprzedzenie go przedrostkiem 0x oznacza liczbę w zapisie szesnastkowym). Podprogram ów wywołuje odpowiednią funkcję o numerze podanym w rejestrze ah (wcześniej nadaliśmy temu rejestrowi wartość 9, więc instrukcja ''int 0x21'' wywołała funkcję numer 9 przerwania numer ''21 w zapisie szesnastkowym''). Wywołana w tym przypadku funkcja wyświetla w konsoli ciąg znaków, którego adres znajduje w rejestrze dx (przydzieliliśmy temu rejestrowi adres naszej zmiennej ''tekst''). W efekcie na ekranie pojawi się
<source lang="asm">
Linia 68:
=== Goodbye world... ===
Powyższy kod początkowo może trochę odstraszać, lecz jeśli masz pierwszy raz styczność z
<br>Niestety, luksus ten dotyczy nas jedynie przy pisaniu własnych programów. Jeśli uczysz się asemblera głównie pod kątem zrozumienia
<noinclude>{{Nawigacja|Asembler X86|
|