Asembler x86/Pierwszy program/NASM: 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 10:
tekst db "Hello World!",0Dh,0Ah,"$"
 
segment .sstosik stack
resb 64
segment .text
mov ax, .data
mov ds, ax
mov ax, .sstosik
mov ss, ax
mov dx, tekst
Linia 30:
Ta linijka dodaje zmienną do obecnie definiowanego segmentu (w tym przypadku chodzi o segment ".data"). ''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 0D0A (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 nie mogłyby określić, gdzie jest jej koniec, więc wyjechałyby poza przydzielony jej obszar pamięci dopóki nie znalazłyby znaku $.
 
<source lang="asm">segment .sstosik stack</source>
Tworzy segment stosu (''stack'') o nazwie ''.sstosik'' i...
 
<source lang="asm">resb 64</source>
Linia 42:
mov ax, .data
mov ds, ax
mov ax, .sstosik
mov ss, ax
</source>
Instrukcja [[Asembler x86/Instrukcje/Transferowe#mov|mov]] kopiuje wartość drugiego parametru do pierwszego. Jako, że po starcie programu rejestry segmentowe są niezainicjowane, musimy ręcznie przydzielić im adresy odpowiednich segmentów. W pierwszej linijce kopiujemy '''adres''' segmentu ''.data'' do rejestru ax. Następnie, z rejestru ax kopiujemy go do rejestru segmentowego ds (instrukcja mov nie pozwala na bezpośrednie przydzielanie wartości rejestrom segmentowym, dlatego musieliśmy użyć rejestru ax jako pośrednika). W następnych 2 linijkach powtarzamy operację, tyle że kopiujemy adres segmentu .sstosik (który jest stosem naszego programu) do rejestru ss.
 
<source lang="asm">
Linia 70:
 
segment .data
msg db "Hello World!\n", 0Ah ; umieszcza w segmencie danych ciąg znaków zakończony znakiem końca linii
 
segment .text
Linia 84:
; wyjscie z programu
mov eax, 1
incxor ebx, ebx
int 0x80
; KONIEC PROGRAMU