Asembler x86/Pierwszy program/MASM: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m nawigacja |
posix |
||
Linia 6:
<source lang="asm">
.model
.386
.data
tekst db "Hello World!
.stack 100h
.code
.startup
mov ecx, offset tekst
int 21h▼
mov edx, 13
.exit
end
Linia 23 ⟶ 25:
Wygląda strasznie? Na pewno. Postaram się zrozumiale wyjaśnić o co w nim chodzi.
<source lang="asm">
.model
</source>
Dyrektywa .model pozwala zdefiniować z jakiego modelu pamięci ma korzystać nasz program. Model
<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!
</source>
Wrzuca do segmentu z danymi ciąg znaków "Hello World!" zakończony znakiem nowej linii
<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
</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
mov edx, 13
mov ebx, 1
</source>
Kopiuje wartość
<source lang="asm">
int
</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
<source lang="asm">
.exit
|