Neke instrukcije koje ce vam biti potrebne

Ovo je spisak nekih asemblerskih instrukcija koje su vrlo bitne i koje se koriste prilicno cesto.

ADD:Dodaj vrednost prvog broja drugom (sabiranje)

Sintaksa:

ADD operand1,operand2
Ova instrukcija dodaje operand2 operandu operand1. Odgovor (rezultat) je smesten u operand1. Neposredni podatak ne moze da se koristi za operand1 (jer se u njega smesta rezultat), dok to ne vazi za operand2.

SUB: Oduzimanje dva broja
Sintaksa:

SUB operand1,operand2
Ova instrukcija oduzima operand2 od operand1.Neposredni podatak ne moze da se koristi za operand1 ali moze za operand2.

MUL: Mnozi dva pozitivna broja
IMUL: Mnozi brojeve sa znakom (bilo pozitivne bilo negativne)
Sintaksa:

MUL registar ili promenljiva
IMUL registar ili promenljiva
Ova instrukcija mnozi AL i AX sa vrednoscu zadatog registra ili promenljive. Ako se mnozi sa operandom velicine bajta rezultat je u AX a ako se mnozi sa operandom velicine reci rezultat je smesten u DX:AX.

Na 386, 486 iii Pentiumu moze se koristiti EAX registar a rezultat je smesten u EDX:EAX.

DIV: Deli dva pozitivna broja
IDIV: Deli brojeve sa znakom (bilo pozitivne bilo negativne)
Sintaksa:

DIV registar ili promenljiva
IDIV registar ili promenljiva
Ove instrukcije rade slicno kao i MUL i IMUL tako sto dele vrednost u AX sa zadatim registrom ili promenljivom.Rezultat je smesten na dva mesta. U AL se nalazi rezultat a u AH ostatak pri deljenju. Ako je operand 16-bitni registar onda se deli DX:AX sa njime i rezultat je u AX a ostatak u DX.

Uvod u procedure

Procedura u asembleru je ekvivalentna funkciji u jeziku C ili Paskalu. Procedura obezbedjuje jednostavan nacin da se enkasuliraju neka izracunavanja i koja se mogu koristiti vise puta i bez previse brige o tome kako one rade. Sa pravilno dizajniranim procedurama mozete zanemariti kako one rade.

Ovako se definise procedura:

PROC ImeProcedure
.
.                  ; Neki kod koji nesto radi 
.
ret                ; Ako ovoga (ret) nema na kraju procedure, compjuter ce zablokirati 
ImeProcedure ENDP 
Isto tako jednostavno je i pozivanje procedure:
call AProcedure
Ovaj sledeci program je primer kako treba koristiti procedure. Isti je kao Prvi.asm (stampa "Hello World!") sem sto se u kodu redi preko procedura.
Listing 3: 3.asm

; Jednostavan program za ilustrovanje rada procedura.
; Prikazace Hello World! na ekranu..

.model small
.stack

.data
Poruka DB "Hello World!$"     ; definisemo poruku

.code 
mov ax,@data 
mov ds,ax

call Prikazi_Poruku          ; Poziv proicedure

mov ax,4C00h                 ; povratak u DOS
int 21h 		


;----------------------------
;  procedura Prikazi_Poruku
;----------------------------
Prikazi_Poruku PROC 

mov dx,OFFSET Poruka 
mov ah,9 
int 21h 

ret
Prikazi_Poruku ENDP 
;-----------------------------
end 

Procedure koje prenose parametre

Procedure ne bi bile tako korisne da se ne mogu prosledjivati parametri koje ona obradjuje. Postoje tri nacina da se proslede parametri proceduri: preko registara, memorije i steka.

Sada cemo vam prikazati tri programska primera koji rade situ stvar preko procedura ali drugacije prosledjuju parametre. Prikazuju na ekranu "A" (ASCII vrednost je 65h) u nekoj boji na izabranom mestu.

Prenos parametara preko registara

Prednost je sto se lako uradi i sto je brzo. Sve sto trebate da uradite je da smestite parametre u registre pre nego sto pozovete proceduru.
Listing 4: 4.asm

; ovo je procedura koja prikazuje karakter na ekranu 
; koristeci registere za prenos parametara 
;(pozicija kursora na kome cemo prikazati karakter u zutoj boji).

.model small
.stack
.code

 

mov dh,4                ; vrsta u kojoj cemo prikazati karakter
mov dl,5                ; red u kome cemo prikazati karakter
mov al,65               ; ascii vrednost karaktera koji cemo prikazati
mov bl,6                ; boja karaktera (zuta)

call Prikazi_Karakter 	; prikazi karakter
mov ax,4C00h            ; prekini program
int 21h

;------------------------------------------------
; procedura Prikazi_Karakter
;------------------------------------------------
Prikazi_Karakter PROC NEAR

push cx                 ; cuvamo registre koji ce biti 
push ax                 ; pregazeni novim vrednostima
push bx

xor bh,bh               ; brisemo bh - video strana 0
mov ah,2                ; funkcija 2h - pomeri kursor
int 10h                 ; vrsta i kolona su vec u dx

pop bx                  ; vrati bx i ax
pop ax                  ; kontra redosledom od smestanja na stek 

xor bh,bh               ; brisemo bh - video strana 0
mov ah,9                ; funkcija 09h - pisemo karakter na ekran
mov cx,1                ; prikazi jedanput
int 10h                 ; poziv bios servisa

pop cx 	                ; vrati cx

ret                     ; povratak tamo odakle smo pozvali proceduru
Prikazi_Karakter ENDP
;------------------------------------------------
end 

Prenos parametara preko memorije

Prednos je sto se lako uradi ali je program zato veci i sporiji.

Da bi ste preneli parametre preko memorije, sve sto trebate da uradite jeste da ih iskopirate u promenljive koje su smestene u memoriji. MOzete da koristite promenljive kao sto koristite i registre ali su zato registri brzi.

Listing 5: 5.asm 

; ovo je procedura koja prikazuje karakter na ekranu 
; koristeci memoriju za prenos parametara 
;(pozicija kursora na kome cemo prikazati karakter u crvenoj boji).

.model small
.stack

.data
Vrsta     db ?     ; promenljive u koje smestamo podatke
Kolona    db ?
Boja      db ?
Karakter  db ?

.code
mov ax,@data 
mov ds,ax

mov Vrsta,4        ; vrsta u kojoj cemo prikazati karakter
mov Kolona,5       ; red u kome cemo prikazati karakter
mov Karakter,65    ; ascii vrednost karaktera koji cemo prikazati
mov Boja,4         ; boja karaktera (crvena)

call P_Karakter    ; prikazi karakter
mov ax,4C00h       ; prekini program
int 21h

;-------------------------------------------------------
; procedura P_Karakter
;-------------------------------------------------------
P_Karakter PROC NEAR

push ax            ; cuvamo registre koji ce biti 
push cx            ; pregazeni novim vrednostima
push bx


xor bh,bh          ; brisemo bh - video strana 0
mov ah,2           ; funkcija 2h - pomeri kursor
mov dh,Vrsta
mov dl,Kolona
int 10h            ; poziv Bios servisa 

mov al,Karakter 
mov bl,Boja
xor bh,bh          ; brisemo bh - video strana 0
mov ah,9           ; funkcija 09h - pisemo karakter na ekran
mov cx,1           ; prikazi jedanput
int 10h            ; poziv bios servisa

pop bx             ; vrati registre u predhodno stanje
pop cx
pop ax

ret                ; povratak tamo odakle smo pozvali proceduru
P_Karakter ENDP
;-------------------------------------------------------
end 

Prenos parametara preko steka

Ovo je najmocniji i fleksibilniji nacin za prenos parametara ali je zato i najkomplikovaniji.
Listing 6: Sesti.asm

; ovo je procedura koja prikazuje karakter na ekranu 
; koristeci stek za prenos parametara 
;(pozicija kursora na kome cemo prikazati karakter u zutoj boji).

.model small
.stack

.data

.code
mov ax,@data 
mov ds,ax

mov dh,4           ; vrsta u kojoj cemo prikazati karakter
mov dl,5           ; red u kome cemo prikazati karakter
mov al,65          ; ascii vrednost karaktera koji cemo prikazati
mov bl,6           ; boja karaktera (zuta)

push dx            ; stavi parametre na stek
push ax
push bx

call Prikazi_K     ; prikazi karakter

pop bx             ; vrati registre u pocetno stanje
pop ax
pop dx

mov ax,4C00h       ; prekini program 
int 21h

;-----------------------------------------------------
; procedura Prikazi_K
;-----------------------------------------------------
Prikazi_K PROC NEAR

push bp            ; sacuvaj bp
mov bp,sp          ; stavi sp u bp
push cx            ; cuvamo registre koji ce se menjati

xor bh,bh          ; brisemo bh - video strana 0
mov ah,2           ; funkcija 2h - pomeri kursor
mov dx,[bp+8]      ; vracamo dx (vrsta i kolona)
int 10h            ; pozov bios servisa

mov ax,[bp+6]      ; karakter
mov bx,[bp+4]      ; boja
xor bh,bh          ; brisemo bh - video strana 0
mov ah,9           ; funkcija 09h - pisemo karakter na ekran
mov cx,1           ; prikazi jedanput
int 10h            ; pozov bios servisa

pop cx             ; vracamo registre
pop bp 

ret                ; povratak tamo odakle smo pozvali proceduru
Prikazi_K ENDP
;-----------------------------------------------------
end 

Stek za proceduru sa dva parametra

Da bi ste skinuli parametar sa steka sve stotrebate da uradite je da pronadjete gde se on nalazi. Poslednji parametar na steku je smesten na BP+2 a sledeci na BP+4 i tako dalje (primetite da dodajemo po 2 na BP a to je zato sto stek raste prema opadajucim adresama).

Sta su "memorijski modeli"?

Mi smo koristili .MODEL direktivu da specificiramo koji memorisjki model koristimo, ali sta to znaci?

Sintaksa:
.MODEL MemorijskiModel

gde MemorijskiModel moze biti SMALL, COMPACT, MEDIUM, LARGE, HUGE, TINY ili FLAT.

Tiny
Ovo znaci da postoji samo jedan segment i za kod i za podatke. Ovaj tip programa moze biti .COM fajl.
Small
Ovo znaci da je po difoltu sav kod smesten u jedan segment i da su svi podaci smesteni u jedan segment. To znaci da su sve procedure i promenljive adresirane kao blizu (NEAR) samo preko OFFSET-a.
Compact
Ovo znaci da su procedure (tj. kod) po difoltu smesteni u jednom segmentu ali zato podaci mogu biti smesteni u fizicki razlicitim segmentima. Sto bi znacilo da se za podatke mora ukazati i na segment i na offset. Procedure su blizu (NEAR) a promenljive su udaljene (FAR).
Medium
Ovo je suprotno od compact. Podaci su blizu (NEAR) a procedure su udaljene (FAR).
Large
Ovo znaci da su i procedure i promenljive udaljene (FAR). Moramo ukazati i na segment i na offset.
Flat
Ovo se ne koristi cesto jer je za 32-bitni nesegmentovani memorijski prostor. Za ovo vam treba DOS extender. To bi ste morali da koristite ako pisete program koji ce pozivati funkcije jezika c/c++ koji koriste DOS extender kao sto su DOS4GW ili PharLap.

Sadrzaj