Asembler x86/Pierwszy program/NASM: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m nawigacja |
poprawki |
||
Linia 7:
====DOS/Windows====
<source lang="asm">
segment
tekst db "Hello World!"
segment
resb 64
▲segment kod
▲ mov ah, 9
▲ int 0x21
▲ mov ax, 0x4C00
▲ int 0x21
</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
Oznacza, że od tego miejsca w dół definiowany jest nowy segment o nazwie "
<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
<source lang="asm">segment
Tworzy segment stosu (''stack'') o nazwie ''
<source lang="asm">resb 64</source>
... i rozmiarze 64 bajtów. Dyrektywa ''resb'' jest podobna do poznanej przed chwilą dyrektywy ''db'', tyle że tworzy konkretną ilość zmiennych bez przydzielania im wartości początkowych.
<source lang="asm">segment
Analogicznie do pierwszej linijki w naszym programie, tworzy segment o nazwie ''
<source lang="asm">
mov ax,
mov ds, ax
mov ax,
mov ss, ax
</source>
Linia 57 ⟶ 50:
mov dx, tekst
mov ah, 9
int
</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 (
<source lang="asm">
mov ax,
int
</source>
Wywołuje funkcję przerwania 21 o numerze
====Linux====
Linia 80 ⟶ 70:
segment .data
msg db
segment .text
Linia 90 ⟶ 80:
mov ecx, msg ; adres pierwszego znaku do wyświetlenia
mov edx, 14 ; liczba znaków do wyświetlenia
int
; wyjscie z programu
mov eax, 1
int 0x80
; KONIEC PROGRAMU
|