mov ax,10 ; stavi 10 u ax mov bx,20 ; stavi 20 u bx mov cx,30 ; stavi 30 u cx mov dx,40 ; stavi 40 u dx
Primetite da u asembleru sve posle ";" se ignorise pa je zato veoma korisno
za pisanje komentara.
Push i Pop: Instrukcije za rad sa Stekom
Za stek ste culi ali ne znate kako da stavljate podatke i citate
podatke sa njega. Postoje dve jednostavne instrukcije koje se koriste
za to: push i pop. Evo kako se one koriste:
PUSH:
Stavlje se podatak na vrh steka.
Sintaksa:
push podatak
POP:
Skida podatak sa vrha steka i smesta ga u specificiran registar ili
promenljivu.
Sintaksa:
pop registar (ili promenljiva)
Ovi primeri prikazuju kako se koriste push i pop instrukcije:
push cx ; stavi cx na stek push ax ; stavi ax na stek pop cx ; stavi vrednost sa vrha steka u cx pop ax ; stavi vrednost sa vrha steka u ax
Primetite da ce vrednosti iz CX i AX razmeniti vrednosti. Za laksi rad postoji instrukcija koja razmenjuje sadrzaj registara: XCHG, koja bi smaljila predhodni deo programa na:
xchg ax,cx ;razmeni sadrzaj ax i cx
MOV: smesta vrednost sa izvorista(source) mesta na odrediste(destination).
Sintaksa:
MOV odrediste, izvristeNa primer:
mov ax,10 ; smesta neposrednu vrednost u ax mov bx,cx ; smesta vrednost iz cx u bx mov dx,NekiBroj ; smesta vrednost NekiBroj u dx
INT: Poziva DOS ili BIOS funkciju koje su podprogrami
za neke stvari za koje ne bi ste zeleli da pisete funkcije
kao na primer: promena video moda, otvaranje fajla itd.
Sintaksa:
INT broj prekida
Na primer:
int 21h ; poziva DOS servis int 10h ; poziva video BIOS prekid
Vecina prekida ima vise od jedne funkcije a to znaci da morate da prosledite broj do funkcije koja vam treba. Taj broj se najcesce stavlja u AH. Da bi ste prikazali poruku na ekranu sve sto treba da uradite je ovo:
mov ah,9 ; podprogram pod brojem 9 int 21h ; poziv prekida
Ali prvo morate da spcificirate sta zelite da stampate na ekran. Ovoj funciji je potrebno
DS:DX da bi bili pokazivac na udaljenu lokaciju gde se string nalazi. String mora da se zavrsi sa dolar simbolom ($). Ovo bi bilo lako kada bi se DS-om manipulisalo direktno, ali posto nije tako moramo da koristimo AX.
Ovaj primer prikazuje kako se to radi:
mov dx,OFFSET Poruka ; DX sadrzi offset poruke mov ax,SEG Poruka ; AX sadrzi segment poruke mov ds,ax ; DS:DX ukazuje na poruku mov ah,9 ; funkcija 9 - prikazi string int 21h ; poziva DOS servis
Reci OFFSET i SEG govore kompajleru da zelimo da smestimo offset/segment poruke "Poruka" da smestimo u registre a ne sadrzaj poruke. Sada kada znamo da postavimo kod tako da prikazemo poruku, moramo da zadamo i poruku koja ce biti prikazana. U data segmentu deklarisemo je ovako:
Poruka DB "Hello World!$"
Primetite da se Poruka zavrsava sa simbolom "$".
Sta u stvari znaci "DB"? "DB" je skracenica od Deklarisi Bajt
i time je poruka predstavljena dao niz bajtova (ASCII karakteri zauzimaju
jedan bajt).
Podaci se mogu deklarisati u razlicitim velicinama: bajt (DB),
rec (DW) i dupla rec (DD), za sada ne morate da brinete o duplim recima
jer vam je potreban 32-bitni registar da bi one stale.
Nekoliko primera pri definisanju podataka:
Number1 db ? Number2 dw ?
Znak pitanja (?) na kraju deklaracije znaci da promenljiva nije inicijalizovana tj nema pocetnu vrednost. Zadavanje pocetne vrednosti je lako:
NekiBroj1 db 0 ; bajt NekiBroj2 dw 1 ; rec
Kada se program ucita NekiBroj1 ce biti jednak nuli a NekiBroj2 ce biti jednak jedinici. Vas program ce takodje biti i tri bajta duzi.
Ako deklarisete promenljivu kao rec ne mozete vrednost te promenljive da smestite u 8-bitni registar kao sto ne mozete da deklarisete promenljivu kao bajt a da je smestate u 16-bitni registar. Na primer:
mov al,NekiBroj1 ; ok mov ax,NekiBroj1 ; greska mov bx,NekiBroj2 ; ok mov bl,NekiBroj2 ; greska
Sve sto treba da zapamtite je da bajt moze da se smesti samo u 8-bitni registar a rec u 16-bitni.
Kako sada znate neke osnovne instrukcije i nesto malo o podacima vreme ja da napisete vas prvi program u asembleru koji se moze kompajlirati.
Izlaz kada imam na kraju poruke $:Listing 1: 1.asm ; Jednostavan program koji ispisuje "Hello World!" ; na ekranu. .model small .stack .data Poruka db "Hello World!$" ; poruka koja treba da se prikaze ; primetite da je na kraju "$" .code mov dx,OFFSET Poruka ; offset od "Poruka" je u DX mov ax,SEG Poruka ; segment od "Poruka" je u AX mov ds,ax ; DS:DX ukazuje na string mov ah,9 ; funkcija 9 - prikazi stringa int 21h ; poziv DOS servisa mov ax,4c00h ; vrati se u DOS int 21h END ;kraj
Hello World!
i izlaz kada smo zaboravili $:
Hello World!??????3+-U??SQRVW????????? ? c-!r-?< t(?N???¦? ???~???+???|¦ ??++&9 E¦t &?E¦???? ?-??_^ZY[??]- 3¦?¤ t??-? ???????????F??+¦J-!r?3+????
Kako izgleda kada se kompajlira nas primer:masm ImeFajla.asm link ImeFajla
D:\MASM>masm 1.asm Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. Object filename [prvi.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]: 49160 + 414261 Bytes symbol space free 0 Warning Errors 0 Severe Errors D:\MASM>link 1 Microsoft (R) Segmented-Executable Linker Version 5.03 Copyright (C) Microsoft Corp 1984-1989. All rights reserved. Run File [PRVI.EXE]: List File [NUL.MAP]: Libraries [.LIB]: Definitions File [NUL.DEF]: