ADD:Dodaj vrednost prvog broja drugom (sabiranje)
Sintaksa:
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.ADD operand1,operand2
SUB: Oduzimanje dva broja
Sintaksa:
Ova instrukcija oduzima operand2 od operand1.Neposredni podatak ne moze da se koristi za operand1 ali moze za operand2.SUB operand1,operand2
MUL: Mnozi dva pozitivna broja
IMUL: Mnozi brojeve sa znakom (bilo pozitivne bilo negativne)
Sintaksa:
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.MUL registar ili promenljiva IMUL registar ili promenljiva
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:
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.DIV registar ili promenljiva IDIV registar ili promenljiva
Ovako se definise procedura:
Isto tako jednostavno je i pozivanje procedure:PROC ImeProcedure . . ; Neki kod koji nesto radi . ret ; Ako ovoga (ret) nema na kraju procedure, compjuter ce zablokirati ImeProcedure ENDP
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.call AProcedure
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
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.
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
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
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
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.