Predstavljanje asemblerskih instrukcija

Postoji veliki broj instrukcija u asemblerskom jeziku ali se negde oko 20 veoma cesto koriste, pa cemo njih i predstaviti ovde. Same instrukcije izgledaju tako sto imaju nazv koji se satoji od tri slova (na primer: MOV koja sluzi za smesti podatak u registar) onda se pise prvi operand pa zarez pa drugi operand.
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

Tipovi operanada

Postoje tri vrste operanada u asembleru: neposerdni, registarski i memorijski. Neposredni je broj koji je poznat u vreme kompajliranja i koji ce uvek biti isti (npr. '29' ili 'Ah'). Registarski operand je bilo koji registar opste namene (npr. AX ili SI). Memorijski operandi su promenljive koje su smestene u memoriji.

Neke instrukcije koje ce vam biti potrebne

Ovo je spisak nekih instrukcija koje morate znati pre nego sto pocnete da pisete programe u asembleru.

MOV: smesta vrednost sa izvorista(source) mesta na odrediste(destination).
Sintaksa:

MOV odrediste, izvriste
Na 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.

Vas prvi program u asembleru

Kako sada znate neke osnovne instrukcije i nesto malo o podacima vreme ja da napisete vas prvi program u asembleru koji se moze kompajlirati.

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
Izlaz kada imam na kraju poruke $:
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 kompajlirati program

Postoji nekoliko instrukcija za kompajliranje i linkovanje programa. Ako imate kompajler koji nije MAS vidite u uputstvu.

MASM

masm ImeFajla.asm
link ImeFajla 
Kako izgleda kada se kompajlira nas primer:
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]:

Sadrzaj