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

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
m nawigacja
posix
Linia 6:
 
<source lang="asm">
.model smallSMALL
.386
 
.data
tekst db "Hello World!",0Ah,0Dh,"$\n"
.stack 100h
.code
.startup
mov dxeax, offset tekst4
mov ahebx, 09h1
mov ecx, offset tekst
int 21h
mov edx, 13
int 21h80h
.exit
end
Linia 23 ⟶ 25:
Wygląda strasznie? Na pewno. Postaram się zrozumiale wyjaśnić o co w nim chodzi.
<source lang="asm">
.model smallSMALL
</source>
Dyrektywa .model pozwala zdefiniować z jakiego modelu pamięci ma korzystać nasz program. Model smallSMALL oznacza segmentowy model pamięci z jednym segmentem kodu i jednym segmentem danych.
<source lang="asm">
.386
Linia 35 ⟶ 37:
Określa, że od tego miejsca w dół definiowany jest segment z danymi.
<source lang="asm">
tekst db "Hello World!",0Ah,0Dh,"$\n"
</source>
Wrzuca do segmentu z danymi ciąg znaków "Hello World!" zakończony znakiem nowej linii (0A0D) oraz znakiem $ określającym, iż jest to koniec naszego ciągu (dla migrantów z C/C++ - jest to odpowiednik znaku '\0'). ''tekst'' jest to nazwa dla naszego ciągu, zaś słowo ''db'' oznacza, że ma być on ciągiem bajtów.
<source lang="asm">
.stack 100h
Linia 51 ⟶ 53:
Jest to makroinstrukcja, która w procesie kompilacji zastępowana jest w tym miejscu kodem wykonującym standardowe początkowe czynności (nadaje odpowiednie wartości rejestrom segmentowym, które są konieczne do poprawnego działania naszego programu).
<source lang="asm">
mov dxecx, offset tekst
</source>
Jeśli zdeasemblujesz dowolny program, prawdopodobnie ujrzysz instrukcje podobne do tej umieszczone jedna za drugą. Każdej instrukcji asemblera używa się wg schematu:
Linia 57 ⟶ 59:
Jeśli chodzi o akurat tą instrukcję - mov kopiuje zawartość B do A. A w tym przypadku to rejestr procesora dx, zaś B (''offset tekst'') to adres naszego ciągu znaków, wydobyty dzięki słowu ''offset'' (użycie samej nazwy zmiennej nie odnosiłoby się do jej adresu a o niego nam w tym przypadku chodzi).
<source lang="asm">
mov aheax, 09h4
mov edx, 13
mov ebx, 1
</source>
Kopiuje wartość 09h4 do naszego rejestru aheax, 1 do ebx, i 13 do edx.
<source lang="asm">
int 21h80h
</source>
Instrukcja int wywołuje podprogram obsługi przerwania (dokładnie co to są przerwania opisane jest w rozdziale [[Asembler X86/Przerwania|Instrukcje]]) o numerze podanym jako A (w tym przypadku chodzi o numer 21h). Podprogram obsługujący przerwanie o tym numerze wywołuje określoną funkcję o numerze przekazanym w rejestrze aheax (przerwanie 21h80h, funkcja przerwania numer 09h4).
<source lang="asm">
.exit