Programiranje u strojnim kodovima i asemblerskom jeziku. Osnovne direktive asemblera

oznake
Oznaka u asemblerskom jeziku može sadržavati sljedeće simbole:


Slova: od A do Z i od a do z
Brojevi: od 0 do 9
Posebni znakovi: upitnik (?)
točka (.) (samo prvi znak)
"komercijalni" znak (@)
podvlaka (_)
dolar ($)

Prvi znak u oznaci mora biti slovo ili poseban znak. Broj ne može biti prvi znak oznake, a znakovi $ i ? ponekad imaju posebna značenja i općenito se ne preporučuju za upotrebu. Velika i mala slova se prema zadanim postavkama ne razlikuju, ali se razlika može omogućiti postavljanjem jedne ili druge opcije u naredbeni redak asembler Maksimalna duljina oznake - 31 znak. Primjeri oznaka: COUNT, PAGE25, $E10. Preporuča se koristiti opisne i semantičke oznake. Nazivi registara kao što su AX, DI ili AL su rezervirani i koriste se samo za označavanje odgovarajućih registara.
Ako se oznaka nalazi ispred instrukcije procesora, odmah iza nje uvijek postoji simbol “:” (dvotočka), koji govori asembleru da stvori varijablu s ovim imenom koja sadrži adresu trenutne instrukcije:
neka_petlja:

petlja neka_petlja
Kada se oznaka pojavljuje prije asemblerske direktive, to je obično jedan od operanda te direktive i dvotočka nije uključena:

segment kodova
lodsw ; pročitati riječ iz niza,
cmp sjekira,7; ako je 7 - izađite iz petlje
kodovig krajeva
Pogledajmo direktive koje rade izravno s oznakama i njihovim vrijednostima: LABEL, EQU i =.

Direktiva LABEL

Tip oznake Direktiva LABEL definira oznaku i specificira njen tip. Tip može biti jedan od: BYTE (bajt), WORD (riječ), DWORD (dupla riječ), FWORD (6 bajtova), QWORD (četverostruka riječ), TBYTE (10 bajtova), NEAR (bližnja oznaka), FAR (daleko oznaka ). Oznaci se daje vrijednost jednaka adresi sljedeće naredbe ili sljedećeg podatka, a tip je izričito naveden. Ovisno o vrsti naredbe
mov label,0 će napisati bajt (riječ, dvostruku riječ, itd.) ispunjen nulama u memoriju, a naredba
oznaka poziva uputit će kratki ili dugi poziv potprogramu.

Korištenjem direktive LABEL pogodno je organizirati pristup istim podacima, i bajtovima i riječima, definiranjem dvije oznake s različitim tipovima ispred podataka.

EQU direktiva

EQU direktiva dodjeljuje vrijednost oznaci, koja je određena kao rezultat cjelobrojnog izraza na desnoj strani. Rezultat ovog izraza može biti cijeli broj, adresa ili bilo koji niz znakova:
label equ izraz

istina jednaka 1
message1 equ "Pokušaj ponovno$"
var2 ekvivalent 4
cmp sjekira,istina ; cmp sjekira,1
db poruka1; db "Pokušaj ponovo$"
mov ax,var2 ; mov ax, 4 Direktiva EQU se najčešće koristi za uvođenje parametara zajedničkih cijelom programu, slično naredbi #define C predprocesora.

Direktiva =

Direktiva = je ekvivalentna EQU, ali oznaka koju definira može prihvatiti samo cjelobrojne vrijednosti. Osim toga, oznaka određena ovom direktivom može se nadjačati.

Svaki asembler nudi cijeli skup posebnih unaprijed definiranih oznaka - to može biti trenutni datum(@date ili ??date), tip procesora (@cpu) ili naziv određenog programskog segmenta, ali jedina predefinirana oznaka koju podržavaju svi asembleri koje smo gledali je $. Uvijek odgovara trenutnoj adresi. Na primjer, naredba

Jmp$

izvodi bezuvjetno grananje na sebi, tako da se od jedne naredbe stvara vječna petlja.

Kako bih bolje razumio cijelu ovu stvar, napisao sam mali program. I dalje ista “Hello World”, ali na novi način :) Tekst ispod:

Program sastavljaju TASM i MASM, ali EXE datoteka koju sastavlja MASM jedan je bajt veća. Primjećujemo da je naredba mov dx,offset msg zamijenjena naredbom lea dx,msgb. LEA postavlja adresu pomaka navedenih podataka u DX, tj. radi isto što i naredba mov s pomakom. Preporučujem da ovo pogledate pod alatom za ispravljanje pogrešaka.



Pogledajmo pažljivo popise sklopova i pronađimo razliku.



Zanimljivo, TASM je sastavio naredbu LEA u u ovom slučaju kao MOV instrukcija (operacijski kod BA), a MASM je asemblirao LEA instrukciju u drugi operacijski kod - 8D16, što je povećalo veličinu programa za 1 bajt. Još ne znam zašto se na to odlučio, ali bilo bi zanimljivo saznati.

Jedan od bitni elementi Ovaj dio knjige sadrži primjere programa u strojni kodovi i to na SKUPŠTINSKOM jeziku. U ispisima ovih programa morat ćemo koristiti ovo

naziva SKUPŠTINSKIM DIREKTIVAMA i sada, vjerojatno, najviše pogodno vrijeme dati ideju o tome što je to.

Pogledat ćemo sljedeće direktive: ORG, EQU, DEFB, DEFW, DEFM i END, ali prije nego ih počnemo razmatrati, moramo čvrsto razumjeti:

1. Direktive ASSEMBLY nisu naredbe procesora Z8 0 i u tom smislu nemaju nikakve veze sa strojnim kodom Z8 0.

2. ASSEMBLER je program koji prevodi (prevodi) tekst koji ste vi napisali u obliku mnemotehnike u objektni kod, a to je strojni kod. A ove ASSEMBLY direktive su neke naredbe asemblerskom programu. Oni nisu prevedeni i neće biti uključeni u objektni kod, ali će vam olakšati pisanje, i što je najvažnije, čitanje programa napisanog u mnemotehnici.

3. Postoji jako puno ASSEMBLY programa i svaki od njih može imati svoje vlastite direktive. Mogu imati iste direktive, ali različite zahtjeve za njihovu upotrebu. Jednom riječju, morate uspostaviti specifične metode za korištenje ASSEMBLY direktiva prema uputama za asemblerski program koji koristite (na primjer, EDITAS, GENS 3, GENS 4, ZEUS, itd.). I iako nema standarda, svejedno, neki temeljni koncepti još uvijek se mogu identificirati, a mi ćemo se usredotočiti na njih.

3.1. Komentari.

Počet ćemo s najjednostavnijim – komentarima. Pišu se nakon simbola ";". (točka-zarez).

Vi, naravno, razumijete da sve što su komentari nije kompajlirano u strojni kod pomoću ASSEMBLY - ovo nema koristi. Služe samo da vam olakšaju rad s popisom koji je netko drugi ili vi sami sastavili, ali prije mnogo vremena.

Na primjer:

10 60001 LD E,A 2 0

Kao što vidite, linija može

; Učitano u registar E koji sadrži -; presa baterije. ; Smanjio ga je za jedan.

samo iz komentara.

oznake.

Oznake uvelike pojednostavljuju pisanje programa u ASSEMBLY mnemotehnici. U operacijama skoka JP, JR, DJNZ i pozivanju potprograma CALL, ne možete navesti adresu na koju želite skočiti, već umjesto toga zamijeniti oznaku. S druge strane, kada pišete naredbe za ovu adresu, stavite oznaku i tamo, na primjer:

10 60001 POČETAK LD B,0 4

20 60003 OPET UKLJ. HL

40 60005 DJNZ, PONOVNO

3.2.

250 260 270

60110 60111 60113

LD A,(HL) CP 80H JR NZ,POČ

Kao što vidite, vrlo je povoljno. Možete odmah vidjeti da je iz linije 40 povratak na oznaku AGAIN ako registar B ne dosegne nulu. Linija 270 vraća se na oznaku BEGIN.

Svakako ima smisla odabrati naziv za oznaku koji odgovara značenju operacije koja se izvodi - to čini popis programa lakšim za čitanje i razumijevanje.

Tijekom kompilacije, program za sklapanje sam će izračunati vrijednosti potrebnih pomaka u uputama procesora i zamijeniti ih umjesto oznaka. Tako, na primjer, u retku 40, umjesto DJNZ AGAIN, objektni kod će sadržavati DJNZ FCH, što je isto.

U prethodnom smo primjeru koristili oznake vrlo štedljivo. Činjenica je da su i referenca na oznaku i sama oznaka bili u istoj proceduri. Ali što ako želite pristupiti oznaci koja se nalazi u drugoj proceduri koju ste jučer napisali i kompajlirali, a što ako trebate prijeći na ROM proceduru i želite koristiti oznaku? U ovom slučaju pomoći će vam direktiva EQU. Ona dodjeljuje oznaku numerička vrijednost. Naravno, tijekom kompilacije ova se direktiva ni na koji način ne pretvara u strojni kod, ali ako postoje reference na ovu oznaku u tekstu programa, tada će vrijednost preuzeta iz EQU direktive biti zamijenjena.

Na primjer, u vašem programu stalno morate pozivati ​​ROM procedure, recimo CLEAR (1EACH=7 8 52) i OUT-LINE (1856H=6230). Zatim na početku svog programa odredite

na primjer nazivajući ih CLEAR-ima

direktiva

vrijednosti svojim oznakama, n

i IZLAZ L.

JASAN

EQU 7 8 52

IZLAZ L

EQU 62 3 0

OZNAČITI

EQU 60016

poziv

znate ove

postupcima ili

po oznaci.

60001

LD HL, (OZNAKA)

60004

LD BC, 0008

60007

LD DE, (04 52)

60010

CALL CLEAR

60013

NAZOVI L

60016

Odmah

dugujem ti

upozoriti,

primjeri

s gledišta

softver

primjere kako se koriste određene ASSEMBLY direktive i ako trebate primjere pravi smisao, tada ćete ga dobiti malo kasnije, u sljedećim poglavljima, gdje ćemo ispitati praktične tehnike programiranje.

Pogledajmo još jednom prethodni primjer. U retku 30 šaljemo paru registara HL ono što je sadržano u adresi na koju ukazuje oznaka LABEL, a koja prema EQU direktivi upućuje na adresu 60016.

Dakle, ćelije 60016 i 60017 sadrže neke podatke koje kasnije može koristiti program. Ove podatke možete sami poslati u ćelije prije kompilacije. I za to ne morate koristiti strojni kod. Početne vrijednosti u memorijskim ćelijama možete postaviti pomoću direktiva DEFB, DEFW i DEFM.

DEFB - DEFINE BYTE - postavljanje bajta.

DEFW - DEFINE WORD - postavite "riječ" ("riječ" su dva uzastopna bajta. Obično je to adresa.) DEFM - DEFINE MESSAGE - postavite poruku (to je nekoliko uzastopnih bajtova). Tipično, asemblerski programi nameću ograničenje koliko bajtova može biti specificirano jednom DEFM direktivom, recimo ne više od pet. Ali ovo vas ne bi trebalo zabrinjavati. Ako želite navesti dugu poruku, možete staviti onoliko DEFM linija u red koliko želite.

Dakle, DEFB specificira jedan bajt (0...255), DEFW specificira dva uzastopna bajta (0...65535), a DEFM specificira grupu uzastopnih bajtova - tekstualna poruka, brojčana tablica itd.

U našem prethodnom primjeru, ako želimo pohraniti neki dvobajtni broj na adrese 60016 i 60017, linija 80 bi morala biti napisana ovako:

80 60016 DEFW 5C92H

90 60018

Pretpostavimo da želite pohraniti riječ "Spectrum" počevši od adrese 60135.

Šifra za slovo "S" Šifra za slovo "p" "e" "c" "t" "r"

"u" "m"

60135

60136

60137

60138

60139

60140

60141

60142

53H 7 0H 65H 63H 7 4H 72H 75H 6DH

DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

možete ga navesti u parovima bajtova:

Ali lakše je i ispravnije postaviti ga kao poruku:

60135 DEFM 5370656374 ; "Spekt"

60140 DEFM 72756D ; "rum"

Jesti poseban slučaj kod programiranja u ASSEMBLY-u, kada se tekst programa također mora unijeti preko DEFB ili DEFM. To je slučaj kada pišete program za ugrađeni kalkulator. Uostalom, asemblerski program može prevesti ASSEMBLY mnemonike u strojni kod, ali ne zna ništa o kodovima kalkulatora i ne poznaje njegove mnemonike. Kod kalkulatora je interna "Sinclairova" stvar, njegova interpretacija

Programi koji se nalaze u ROM-u se obrađuju i kod kalkulatora nema nikakve veze s procesorom i njegovim naredbama. Stoga ćete samo moći unijeti naredbe kalkulatora u asemblerski program kao niz neovisnih bajtova, tj. kroz DEFB ili DEFM.

U prvom dijelu knjige koristili smo mnemotehničke oznake za naredbe kalkulatora, kao što su add, stk_data s_lt itd., i pisali smo ih malim slovom, za razliku od procesorskih naredbi. Ali to smo radili prije i nastavit ćemo to činiti samo radi razumijevanja i lakšeg snimanja. Program ASSEMBLY ne poznaje takve mnemonike;

Dakle, uz pomoć DEFB, DEFW i DEFM postavljaju početne vrijednosti programskih varijabli, unose tablice, poruke i bilo koje druge nizove podataka u program, čak

grafike, kao i kodne sekvence koje asemblerski program ne razumije kao ASSEMBLY naredbe.

3.5. Direktive ORG, END.

Samo moramo razmotriti dvije najtrivijalnije direktive. ORG direktiva deklarira adresu s koje će se program sastaviti. To mora biti prva direktiva u izvornom kodu, iako u načelu prije nje mogu biti komentari.

Primijetili ste da smo u gornjim primjerima s lijeve strane napisali stupac adresa u kojem će se nalaziti određene naredbe. Dakle, ovo nije potrebno raditi kada programirate u ASSEMBLY. Dovoljno je dati direktivu na samom početku

10 ORG 63000

a zatim će asemblerski program sam izračunati u kojoj će se memorijskoj ćeliji nalaziti ova ili ona instrukcija. Ovo uvelike pojednostavljuje proces programiranja. A ako napravite izmjene u gotovom tekstu, ASSEMBLER će sam ispraviti sve adrese.

Direktiva END označava kraj programa. Ako postoji nešto drugo nakon njega, ASSEMBLY će to zanemariti tijekom kompilacije.

To je vjerojatno sve što vrijedi znati o ASSEMBLY direktivama za početak. Ovo nisu sve upute s kojima se možete susresti u životu, a pravila za njihovo korištenje su različita za različite ASEMBLERE, ali u velikoj mjeri ovaj minimum će zadovoljiti 90 posto vaših informativnih potreba, a ostatak biste trebali dobiti iz uputa za ASEMBLER s kojim radite.

Pri pisanju programa u asemblerskom jeziku koriste se direktive koje prevoditelju pokazuju mjesto programa u memoriji, definiraju makronaredbe, inicijaliziraju memoriju itd. Popis direktiva i njihovi opisi dani su u tablici. 1.8. Sve direktive počinju točkom. Navedimo ukratko funkcije koje direktive obavljaju u svakom segmentu.

Segment programa otvara se direktivom .CSEG. Ako program počinje ovim segmentom, direktiva možda nedostaje. U programskom segmentu možete koristiti .ORG direktivu za označavanje početka segmenta.

Direktiva .DB u segmentu definira jedan bajt ili grupu bajtova konstanti upisanih u Flash memoriju. Direktiva .DW definira riječ ili skupinu riječi koje se zapisuju u memoriju kao konstante. Početak snimanja konstanti određen je oznakom koja prethodi odgovarajućoj direktivi. Nabrojane konstante odvajaju se zarezima.

Direktiva .DEF registru dodjeljuje simboličko ime. .EQU, .SET direktive dodjeljuju vrijednost imenu. Ime kojem je vrijednost dodijeljena direktivom .EQU ne može se ponovno dodijeliti, a vrijednost se ne može promijeniti. Ime dodijeljeno .SET direktivom može se promijeniti drugom .SET direktivom.

Direktiva .DEVICE specificira tip ciljnog mikrokontrolera koji će se koristiti za izvođenje programa. Prisutnost ove direktive omogućuje kontrole za programske upute u odnosu na fizički uređaj, upozorenje o nemogućnosti izvršavanja određenih instrukcija, veličini korištene memorije itd.

Direktiva .INCLUDE s nazivom datoteke koristi se za uključivanje druge datoteke u tekst programa.

Tablica 1.8. Popis direktiva

Direktiva

Opis

Rezervirajte bajtove u RAM-u

Programski segment

Definirajte bajt – konstantu u Flash memoriji ili

Dodijelite simbolično ime registru

Određuje uređaj za koji se kompajlira

program

Segment podataka

Definira riječ u Flash memoriji ili EEPROM-u

Kraj makronaredbe

Postavite stalni izraz

EEPROM segment

Izlaz iz datoteke

Priložite drugu datoteku

Omogući generiranje popisa

Omogući makro proširenje u popisu

Početak makronaredbe

Isključite generiranje popisa

Postavite položaj u segmentu

Postavite varijablu na ekvivalentan izraz

.MACRO i .ENDMACRO direktive uokviruju makro definiciju. Definicija makronaredbe može imati do 10 parametara sa fiksna imena@0,…,@9. Prilikom pozivanja makro definicije, parametri su navedeni kao popis u numeričkom redoslijedu.

Segment podataka počinje s .DSEG direktivom. U segmentu se mogu koristiti direktive .ORG i .BYTE. Direktiva.BYTE navodi broj bajtova kojima će se pristupiti tijekom izvođenja programa. Rezervirano područje počinje na adresi navedenoj oznakom prije direktive.

Segment vrste EEPROM-a počinje s .ESEG direktivom. U segmentu se mogu koristiti direktive .ORG, .DB, .DW. Direktiva .DB u segmentu specificira jedan ili grupu bajtova koji se upisuju u EEPROM. Direktiva.DW definira riječ ili skupinu riječi zapisanih u EEPROM memoriju u parovima od 2 bajta. Početak snimanja bajtova i riječi određen je oznakom koja prethodi odgovarajućoj direktivi.

Naredbe .LIST, .NOLIST, .LISTMAC koriste se za kontrolu izlaza popisa.

Direktive su kontrolne naredbe prevoditelja. Deklaracija svakog od njih mora započeti točkom. Praksa pokazuje da se u svakom asembleru najintenzivnije koristi samo oko 10...20 direktiva. Svi ostali su ili izborni ili odgovorni za kontrolu samo manjih svojstava prevoditelja. “Osnovne” direktive, koje su tipične i za asemblere drugih procesora, uključuju direktive .equ, .org, .def, .sseg, .dseg itd. Pa, takve direktive kao što su .dq, .exit, .listmac in pravi programi stvarno su vrlo rijetki. Ispod je popis, opis i primjeri korištenja direktiva iz vlasničkog asemblera AVR mikrokontrolera.

Zamjene za direktivu .include tekstualna datoteka na mjesto u programu gdje se koristi. Uz to, sama zamjenska datoteka također može sadržavati direktivu .include. Ako se datoteka nalazi u direktoriju projekta ili u jednoj od servisnih mapa, tada umjesto puni put, dozvoljeno je navesti samo poveznicu na njegovo ime.

Direktiva.uključiti
Sintaksa pisanja:
.include "(put do datoteke)"
Primjer upotrebe:

Uključi "m8def.inc" ;umetni standardnu ​​datoteku zaglavlja

Direktiva .exit govori asembleru gdje datoteka završava izvorni tekst. Svi iskazi nakon direktive postaju nevidljivi prevoditelju. Ako se .exit pojavljuje u uključenoj datoteci, tada izgradnja projekta završava linijom u kojoj se nalazi direktiva .include. Ako ne postoji direktiva .exit, uzima se u obzir krajnja točka izgradnje zadnji redak izvorni tekst.

Direktiva.izlazak
Sintaksa pisanja:
.Izlaz
Primjer upotrebe:

Izlaz ; kraj datoteke

Naredbe .nolist i .list kontroliraju datoteku popisa, koja se obično generira nakon izgradnje projekta. Prvi od njih zabranjuje, a drugi, u skladu s tim, dopušta izlaz informacija u datoteku. Direktiva .list nadjačava akciju .nolist i obrnuto.

Direktive.nolist, .list
Sintaksa pisanja:
.nolist, .list
Primjer upotrebe:

Nolist ;zabrani ispis teksta datoteke “m8def.inc” .include "m8def.inc" ;u popis programa file.list ;nastavi ispis informacija

Direktiva .equ dodjeljuje numeričku vrijednost simboličkom imenu. Simboličko ime mora biti jedinstveno i ne može se mijenjati dok se program piše. Direktiva se ne može koristiti za dodjelu simboličkih imena registrima opće namjene.

Direktiva.eq
Sintaksa pisanja:
.equ (simbolično ime) = (izraz)
Primjer upotrebe:

Equ DDRB = 0x17 ;postavite naziv DDRB na 0x17 .equ PORTB = DDRB + 1 ;postavite naziv PORTB na 0x18

Direktiva .set ima isti učinak kao i .equ. Ali za razliku od potonjeg, simbolički naziv može se redefinirati bilo gdje u programu.

Direktiva.set
Sintaksa pisanja:
.set (simboličko ime) = (izraz)
Primjer upotrebe:

Postavite OFFSET = 0x100 ; dodjeljivanje imena OFFSET vrijednosti 0x100.

.set OFFSET = OFFSET + 1 ;nadjačati OFFSET vrijednost Direktiva .def dodjeljuje simboličko ime jednom od registara opće namjene. U daljnjem tijeku programa dati ime

može se nadjačati direktivom .undef.
Sintaksa pisanja:
Direktive .def, .undef
.def (simbolično ime) = (mala i mala slova)
Primjer upotrebe:

.undef (simbolično ime)

.db, .dw, .dd, .dq direktive namijenjene su rezerviranju memorije mikrokontrolera za inicijalizirane podatke. Svi oni mogu se koristiti samo u kodnim i EEPROM memorijskim segmentima. Razlika između ovih direktiva je bitna dubina predstavljenih podataka. Direktiva .db rezervira bajtove, .dw rezervira riječi, .dd rezervira dvostruke riječi. U rijetkim slučajevima također može biti zgodno koristiti .dq direktivu koja rezervira 64-bitne podatke.

Direktive.db, .dw, .dd, .dq
Sintaksa pisanja:
(oznaka): .db (8-bitni podaci)
(oznaka): .dw (16-bitni podaci)
(oznaka): .dd (32-bitni podaci)
(oznaka): .dq (64-bitni podaci)
Primjer upotrebe:

Oznaka: .db 0xFA, 250, -6, 0b11111010 .dw 0xFADE, 64222, -1314, 0b1111101011011110 .dd 0xFADEEFCA, 4208914378, -86052918 .dq 0xFADEEFCAEFBACDEF, 1 8077149609196178927, -521103510453211

Direktiva.byte rezervira memoriju za neinicijalizirane podatke u segmentima SRAM i EEPROM.

Direktiva.bajt
Sintaksa pisanja:
(oznaka): .byte (količina podataka za rezervirati)
Primjer upotrebe:

Equ PAGESIZE = 0x20 međuspremnik: . bajt 2*PAGESIZE ;rezerviraj 64 bajta u SRAM-u

.dseg, .eseg, .cseg direktive definiraju početak podataka, EEPROM i segmente koda. U izvorna datoteka svaki segment može biti predstavljen u samo jednom primjerku. Ako sve ove direktive nedostaju u programu, kompajler prema zadanim postavkama smatra da se sve izjave nalaze u odjeljku koda.

Direktive .dseg, .eseg, .cseg
Sintaksa pisanja:
.dseg
.eseg
.cseg
Primjer upotrebe:

Dseg ;početak međuspremnika segmenta podataka: . bajt 32 ;rezerviranje 32 bajta za međuspremnik u SRAM-u .cseg ;početak segmenta koda rjmp početni . string: .db "ATmega8",0 ;string pohranjen u FLASH memoriji.eseg ;početak segmenta EEPROM memorije _var: .byte 2 ;rezerviranje 2 bajta za varijablu _var _cnst: .db 0xAA ;rezerviranje bajta za varijablu _cnst = 0xAA

Direktiva.org vam omogućuje postavljanje početne adrese prevoditelja unutar segmenata koda, podataka i EEPROM-a. Kada se koristi u segmentu koda, direktiva navodi adresu lokacije 16-bitne programske riječi.

Direktiva.org
Sintaksa pisanja:
.org (početna adresa)
Primjer upotrebe:

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;početak segmenta podataka.org SRAM_START ;rezerviranje 32 bajta u SRAM-u za međuspremnik, međuspremnik: . bajt 32 ;počevši od adrese 0x60 .cseg ;početak segmenta koda.org 0 ;resetirati vektor na adresi 0 rjmp početno .

Direktive .macro, .endmacro (.endm) definiraju početak odnosno kraj makronaredbe.

Directives.macro, .endmacro (.endm)
Sintaksa pisanja:
.macro (ime makronaredbe)
Primjer upotrebe:

Makro set_bit ;deklaracija makronaredbe za postavljanje bita porta sbi @0,@1 ;postavi bit @1 registra porta @0 sbi @0-1,@1 ;konfiguriraj liniju @1 DDRx registra .endm za izlaz .

set_bit PORTB,0 ;postavi port B logiku 1 na liniju 0

Direktiva .listmac dopušta prošireni prikaz makro teksta u datoteci popisa. U ovom slučaju, sadržaj svake definicije makronaredbe na koju se program naiđe prikazuje se u cijelosti. Ako se direktiva ne koristi, tada se kod unutar makronaredbe ne daje.
Sintaksa pisanja:
Direktiva.listmac
Primjer upotrebe:

.listmac

Listmac ;omogućuje proširenje teksta makronaredbe u datoteci popisa Namjere .message, .warning, .error namijenjene su za izlaz u prozoru izgradnje projekta dodatne informacije

o napretku kompilacije programa. Direktiva .message generira poruku za liniju u kojoj je naišao na njen poziv. Korištenje .warning rezultira upozorenjem, a .error porukom o pogrešci. U potonjem slučaju, izgradnja projekta se zaustavlja.
Sintaksa pisanja:
Direktive .message, .warning, .error
.message "(tekstualna poruka)"
.warning "(tekst upozorenja)"
Primjer upotrebe:

.error "(tekst poruke o pogrešci)"

Poruka "Makronaredbe su pozvane ovdje." .upozorenje "Previsoka frekvencija!" .greška "Pogrešan makro argument!" Skupina direktiva uvjetne kompilacije.ifdef, .ifndef, .if, .else, elif, .endif koriste se za umetanje programski kod ovisno o raznim uvjetima

. Direktiva .ifdef provjerava prisutnost simboličke deklaracije naziva. Direktivu može pratiti skup naredbi koje će biti umetnute u tekst ako je testni uvjet "true" (ime je deklarirano). Direktiva .ifndef je suprotna od .ifdef, koja provjerava nepostojanje simboličke deklaracije naziva. Direktiva .if izvodi zamjenu koda kada je uvjet usporedbe naveden kao njen parametar zadovoljen. Naredbe koje se moraju izvršiti ako je uvjet direktive .if "false" nalaze se nakon direktive .else. Grananje poput “if” - “then” može imati nekoliko razina ugniježđivanja zahvaljujući direktivi .elif. Svaki blok provjere koji počinje s .ifdef, .ifndef, .if mora se zatvoriti direktivom .endif.
Sintaksa pisanja:
Direktive if, .ifdef, .ifndef, .else, elif, .endif
.ifdef (znak) (ili .ifndef (znak))
.if (uvjet)
.else (izraz) (ili .elif (uvjet))
Primjer upotrebe:

Makro del_ms ;makro koji generira vremensko kašnjenje u ms.ifndef FREQ ;ako konstanta FREQ (frekvencija u Hz) nije deklarirana, .upozorenje "Undefined FREQ constan!" ;izdati upozorenje i.equ FREQ = 1000000 ;dodijeliti zadanu vrijednost na 1 MHz.endif .equ DELAY = (@0*FREQ)/4000 ;vrijednost postavke vremenske odgode.if DELAY > 65535 ;ako je DELAY veće od 2 bajta , zatim pogreška "Cjelobrojno prekoračenje u DELAY!" ;implementacija makronaredbe nije moguća.else push XL ;spremite radne registre XL, XH push XH ldi XH,high(DELAY) ;vremenski ciklus kašnjenja ldi XL,low(DELAY) sbiw XH:XL,1 brne PC-1 pop XH pop XL ;vrati radne registre XH, XL sa stoga .endif .endm . .equ FREQ = 2000000 ;ad taktna frekvencija

2 MHz. del_ms 25 ;formiranje vremenske odgode od 25 ms

Asembleri MASM, TASM i WASM međusobno se razlikuju. Međutim, stvaranje jednostavnih programa za njih praktički nema razlika, s izuzetkom same montaže i povezivanja. Dakle, naš prvi program za MASM, TASM i WASM koji izlazi englesko pismo "A" na trenutnoj poziciji pokazivača, odnosno lijevo gornji kut

zaslon: Model tiny .code ORG 100h početak: MOV AH,2 MOV DL,41h INT 21h INT 20h END početak Ovaj tekst se može upisati na bilo kojem jednostavnom jeziku uređivač teksta

- na primjer, u NotePadu iz WINDOWS-a (ali ne u Wordu ili drugim "sofisticiranim"). Međutim, preporučujem "napredni" uređivač teksta s isticanjem sintakse, kao što je PSPad (vidi odjeljak). Zatim tu datoteku spremimo s ekstenzijom .asm, na primjer, u mapu MYPROG. Nazovimo datoteku atest. Dakle, dobili smo: C:\MYPROG\atest.asm.
BILJEŠKA

Imajte na umu da smo u prvoj naredbi napisali 2 umjesto 02h. MASM, TASM i WASM, poput Emu8086, dopuštaju takve “slobode”. Iako možete napisati 02h - neće biti greške.:

Objašnjenja za program.model sićušan – 1. red. Direktiva .model definira memorijski model za određenu vrstu datoteke. U našem slučaju, ovo je datoteka sa COM proširenje

, stoga odabiremo sićušni model koji kombinira segmente koda, podataka i hrpa. Maleni model dizajniran je za stvaranje datoteka tipa COM..kodirati

– 2. red. Ova direktiva započinje segment koda. ORG 100h – 3. red. Ova naredba postavlja programski brojač na 100h jer prilikom učitavanja COM datoteke u memoriju, DOS dodjeljuje prvih 256 bajtova PSP bloku podataka ( decimalni broj

početak: MOV AH, 02h– 4. red. Oznaka za početak postavlja se ispred prve naredbe u programu i koristit će se u direktivi END za označavanje s kojom naredbom program počinje. Instrukcija MOV postavlja vrijednost drugog operanda u prvi operand. To jest, vrijednost 02h se stavlja u registar AN. Zašto se to radi? 02h je DOS funkcija koja prikazuje znak na ekranu. Pišemo program za DOS, pa koristimo naredbe ovoga operativni sustav(OS). I ovu funkciju (ili bolje rečeno njen broj) upisujemo u registar AH, jer prekid 21h koristi ovaj registar.

MOV DL, 41h– 5. red. U upisnik DL upisuje se oznaka znaka "A". ASCII kod za znak "A" je 41h.

INT 21h– 6. redak. Ovo je isti prekid 21h - naredba koja uzrokuje funkcija sustava DOS naveden u registru AN (u našem primjeru to je funkcija 02h). Naredba INT 21h glavno je sredstvo interakcije između programa i OS-a.

INT 20h– 7. redak. Ovo je prekid koji operacijskom sustavu govori da izađe iz programa i prenese kontrolu na aplikaciju konzole. Ako je program već preveden i pokrenut iz OS-a, naredba INT 20h vratit će nas u OS (primjerice u DOS).

KRAJ početak– 8. redak. Direktiva END završava program dok pokazuje u kojoj točki treba započeti njegovo izvršenje.