Professional Documents
Culture Documents
Programarea Sistemelor Cu Microprocesoare
Programarea Sistemelor Cu Microprocesoare
1
asamblare se scrie într-un fișier text (fișier sursă - ASCII), cu ajutorul unui editor și se stochează
pe un suport de memorie de masă (harddisk).
Pentru a scrie un program în limbaj de asamblare este necesară cunoașterea instrucțiunilor
microprocesorului: numele lor, operanzii pe care îi utilizează, efectul produs în urma execuției
lor, contextul în care se pot folosi, precum și o serie de reguli pentru organizarea fișierului
sursă: formatul unei linii de text, modul de indicare a adreselor instrucțiunilor, modul de
definire al secvențelor de instrucțiuni (codul programului), al constantelor și variabilelor (datele
programului), modul de amplasare al codului și datelor în spațiul de memorie, definirea
adreselor de memorie, accesul la dispozitivele de I/E, etc.
Toate aceste reguli, împreună cu setul de instrucțiuni al microprocesorului sunt stabilite și
recunoscute de un program denumit asamblor. Acesta poate transforma un fișier sursă în
limbaj de asamblare într-un program direct executabil de către microprocesor, sub forma unui
fișier în format binar care conține aceleași instrucțiuni, dar codificate în limbaj mașină.
Pe măsură ce crește complexitatea programelor, scrierea în întregime a unei aplicații în limbaj
de asamblare – deși ar putea conduce la programe executabile rapide și care ocupă un spațiu
redus de memorie – devine dificilă și anevoioasă. De aceea, se apelează de obicei la limbaje de
nivel mai înalt (de exemplu limbajul C) și la programe de translatare denumite compilatoare,
2
care simplifică scrierea programelor sursă, dar cu o penalizare în ceea ce privește viteza de
execuție și dimensiunea codului mașină generat.
Compilatoarele actuale folosesc metode de optimizare care pot crește viteza sau reduce
dimensiunea codului generat, în funcție de opțiunile selectate. Chiar și în aceste condiții, pentru
a obține performanțe ridicate în ceea ce privește viteza de execuție se apelează la scrierea în
limbaj de asamblare a unor module critice, în special a unor drivere de sistem. De asemenea, o
serie de facilități ale microprocesoarelor sunt accesibile doar cu ajutorul unor instrucțiuni
speciale, care nu au corespondent în limbajele de nivel înalt, de aceea pentru a le folosi se
apelează la inserarea acestor instrucțiuni direct în codul sursă de nivel înalt (instrucțiuni in-line).
Nu în ultimul rând, pentru a exploata într-un mod eficient arhitectura și organizarea internă a
microprocesorului este necesară cunoașterea acestor particularități și a instrucțiunilor în limbaj
de asamblare care le exploatează, pentru depanarea unor defecte altfel greu sau imposibil de
găsit și de corectat în codul generat.
Pentru a facilita realizarea unor aplicații complexe, codul sursă se împarte de obicei în mai
multe fișiere, care se asamblează/compilează separat. Apoi se utilizează un program denumit
editor de legături (linker), care pune modulele generate de asamblor/compilator într-un singur
fișier binar executabil.
3
Pentru a fi executat de către microprocesor, fișierul executabil trebuie încărcat în memoria
sistemului cu microprocesor. Încărcarea programului executabil în memorie se poate face prin
programarea memoriei înafara sistemului (într-un dispozitiv numit programator de memorii)
sau în sistem (ISP – In System Programming), prin aducerea memoriei ROM/FLASH în regim de
programare. Altă variantă este încărcarea programului executabil ca un bloc de date într-o zonă
de memorie RAM, de unde apoi microprocesorul îl poate extrage și executa instrucțiune cu
instrucțiune (memorie comună sau von Neumann).
Pentru aceasta se folosesc programe utilitare de încărcare care comunică cu sistemul țintă,
adică cu sistemul cu microprocesor pentru care a fost scris programul. Aceleași programe
utilitare pot avea facilități de lansare în execuție a programului încărcat și de testare/depanare
(debugger): execuție pas cu pas, instrucțiune cu instrucțiune, inserare a unor puncte de oprire
(breakpoint), vizualizarea unor variabile din registre și din memorie, astfel încât să se poată
urmări și verifica modul de execuție al codului, evoluția datelor și evenimentele apărute pe
parcursul rulării. Fișierul executabil generat poate fi într-un format binar sau într-un format text
(de exemplu Intel Hex), care conține informații despre codul mașină și adresele fizice la care
acesta trebuie încărcat, informații deosebit de utile pentru utilitarele de încărcare în memorie.
Operațiile de testare/depanare la momentul execuției sunt mai ușor de urmărit la nivel de cod
sursă decât doar la nivelul resurselor interne ale microprocesorului. De aceea, fișierul
4
executabil generat de editorul de legături poate include pe lângă codul mașină și informații
despre simbolurile definite în program și despre codul sursă din care acesta a fost generat.
Testarea/depanare codului generat se poate face direct pe sistemul țintă cu microprocesor
(target system) sau într-un simulator software, care permite testarea anumitor funcții și în
absența sistemului fizic cu microprocesor.
Toate aceste programe utilitare sunt de obicei grupate într-un mediu integrat de dezvoltare
(IDE – Integrated Development Environment), Printr-o intefață grafică prietenoasă, acesta
permite gestiunea unui proiect format din mai multe fișiere sursă: editarea codului sursă,
asamblarea/compilarea, editarea legăturilor, încărcarea codului executabil, lansarea în execuție
și testarea/depanarea lui într-un simulator sau pe sistemul țintă, precum și gestiunea
numeroaselor opțiuni pentru fiecare etapă de procesare și pentru fiecare fișier sursă în parte.
3.2. Setul de instrucțiuni al unui microprocesor
Instrucțiunile unui microprocesor se grupează de regulă în funcție de funcționalitate (tipul
operației efectuate). Astfel, un microprocesor poate avea următoarele categorii de instrucțiuni:
Instrucțiuni de transfer, pentru copierea conținutului unei locații sursă într-o locație destinație.
Dimensiunea celor două locații trebuie să fie aceeași. Putem avea astfel instrucțiuni de transfer
între oricare două locații de tip registre, memorie, porturi I/E. Un caz particular de transfer este
5
cel al instrucțiunilor de inițializare al unor locații, cu o valoare precizată explicit sau implicit de
codul instrucțiunii (setare/resetare locații de 1 bit, inițializare a unei locații de 8 biți cu o valoare
indicată de instrucțiune sau implicit cu 0, etc.).
Un alt caz particular de transfer îl constituie salvarea și refacerea din vârful stivei a conținutului
registrelor de uz general.
Instrucțiunile de transfer nu afectează indicatorii de condiții, dacă în transfer nu este implicată
unitatea aritmetică și logică (ALU).
Instrucțiuni aritmetice, pentru efectuarea unor operații aritmetice de adunare / scădere /
înmulțire / împărțire între operanzi de tip întreg, cu sau fără semn.
Instrucțiunile trebuie să indice tipul operației, numărul de operanzi (1, 2 sau mai mulți), valorile
sau localizarea acestora (registre, memorie, porturi de I/E), precum și locul unde se va memora
rezultatul operației. De regulă, tipul operației este indicat de numele instrucțiunii, cele mai
multe instrucțiuni aritmetice au 2 operanzi principali, iar unul dintre aceștia este amplasat
implicit în registrul acumulator, care memorează și rezultatul operației (dacă arhitectura este
orientată pe acumulator).
Excepție fac instrucțiunile de incrementare/decrementare, când unul din operanzi are implicit
valoarea 1, precum și cazul în care se utilizează un al treilea operand, care este indicatorul de
6
transport/împrumut (Carry). Instrucțiunile aritmetice afectează indicatorii de condiții și pot
aduce prin valorile lor informații suplimentare referitoare la rezultatul obținut.
Instrucțiuni logice, pentru efectuarea unor operații booleene de tip ȘI/SAU/SAU exclusiv între
operanzi de tip întreg fără semn.
Ca și cele aritmetice, instrucțiunile logice trebuie să indice tipul operației, numărul de operanzi
(1 sau 2), valorile sau localizarea acestora (registre, memorie, porturi de I/E), precum și locul
unde se va memora rezultatul operației. De regulă, tipul operației este indicat de numele
instrucțiunii, cele mai multe instrucțiuni logice au 2 operanzi principali, iar unul dintre aceștia
este amplasat implicit în registrul acumulator, care memorează și rezultatul operației (dacă
arhitectura este orientată pe acumulator).
Excepție fac instrucțiunile de deplasare/rotire, când se utilizează un singur operand, amplasat
de regulă în acumulator (dacă există). Instrucțiunile logice afectează indicatorii de condiții și pot
aduce astfel informații suplimentare referitoare la rezultatul obținut.
Instrucțiuni de ramificare, folosite pentru modificarea secvenței liniare de instrucțiuni, în
ordinea crescătoare a adreselor de memorie program indicată de numărătorul de program (PC).
Ele se execută prin modificarea conținutului registrului PC, care determină efectuarea unui salt
7
în program la o altă instrucțiune (de la noua adresa din PC) decât cea care ar fi urmat în mod
implicit, prin incrementarea PC.
Există două tipuri de instrucțiuni de ramificare:
- Instrucțiuni de salt (Jump) - fără posibilitatea de întoarcere și reluare a execuției din locul din
care se face saltul - instrucțiuni care pur și simplu modifică conținutul registrului PC, fără
memorarea valorii anterioare, care indică instrucțiunea următoare în ordine naturală
- Instrucțiuni de apel (Call)/revenire (Return) - cu posibilitatea de întoarcere ulterioară și de
continuare a execuției cu instrucțiunea care urma în ordine naturală, deoarece înainte de
modificarea registrului PC de către instrucțiunea de apel, conținutul acestuia este salvat în
vârful stivei. Ulterior, o instrucțiune de revenire extrage adresa din vârful stivei și prin
încărcarea ei în registrul PC permite continuarea execuției cu instrucțiunea care urma în
program imediat după cea de apel, în ordinea crescătoare a adreselor.
Instrucțiuni de control specifice, folosite pentru modificarea unor locații interne speciale care
determină comportarea microprocesorului în diverse situații, cum ar fi oprirea în așteptarea
unor evenimente externe sau validarea/inhibarea cererilor de întrerupere.
8
3.3. Programarea microcontrolerelor MCS 51 şi compatibile
Toţi membrii familiei MCS-51 execută acelaşi set de instrucţiuni, care este optimizat pentru
aplicaţii de control:
9
Observaţie: Operanzii cu lungimea de 2 octeţi sunt amplasaţi în memorie imediat după codul
operaţiei, mai întâi octetul mai semnificativ şi apoi cel mai puţin semnificativ, adică tocmai
invers decât la microprocesoarele Intel de uz general (de ex. 8085).
3.3.2. Modurile de adresare
- variate şi eficiente, în special pentru operanzii stocaţi în memoria internă de date.
Adresarea directă
- operandul este specificat în instrucţiune printr-o adresă de 1 octet.
Numai RAM-ul intern şi zona SFR pot fi adresate direct.
MOV A, 30h ; în A se încarcă octetul din memoria internă de date, de la adresa 30h
Adresarea indirectă
- instrucţiunea precizează registrul care conţine adresa operandului.
Prin adresare indirectă pot fi specificaţi operanzi atât din RAM-ul intern, cât şi din cel extern.
Pentru adrese de RAM intern (de 8 biţi) se pot utiliza registrele R0 sau R1 ale bancului de
registre curent sau registrul indicator al vârfului stivei, SP.
Pentru adrese de RAM extern (de 16 biţi) poate fi utilizat numai registrul DPTR.
10
În sintaxa instrucţiunii, numele acestor registre trebuie precedate de caracterul „@”.
MOV @R0, A ; octetul din A este stocat în memoria internă de date, la adresa din R0
11
Adresarea imediată
- operandul se află cuprins în instrucţiune, imediat după opcod.
În instrucţiunile cu adresare imediată operandul trebuie precedat de caracterul „#”.
MOV A,#30h ; în A se încarcă constanta 30h
Adresarea indexată
- drept registre index se utilizează DPTR sau PC: acestea conţin adresa de bază, iar
deplasamentul locaţiei adresate se află implicit în acumulator, ceea ce permite codificarea
instrucţiunilor cu adresare indexată pe un singur octet.
Se foloseşte la adresarea operanzilor stocaţi în memoria program, facilitând procedura de acces
la tabelelor organizate în această memorie („look-up tables”), precum şi la o instrucţiune de salt
indirect.
MOVC A, @A+DPTR ; în A se încarcă octetul din memoria program de la adresa dată de
; A+DPTR
Adresarea relativă
- deplasamentul, de un octet cu semn (-128127), se adună la conţinutul registrului PC pentru
a calcula adresa la care va avea loc saltul.
Se utilizează în instrucţiunile de ramificare, deplasamentul fiind indicat simbolic prin rel.
12
JNZ rel ; salt relativ la adresa instrucţiunii curente, dacă valoarea din A e diferită de 0
În tabelul care urmează este prezentat setul de instrucţiuni al familiei MCS-51, împărţit în 5
clase funcţionale:
instrucţiuni aritmetice;
instrucţiuni logice;
instrucţiuni de transfer;
instrucţiuni pentru manipularea variabilelor booleene;
instrucţiuni de ramificare.
13
Notaţii utilizate:
Rn - unul din registrele R0R7 ale bancului de registre selectat
direct - adresa de 8 biţi a unei locaţii interne de date. Poate fi o locaţie din memoria
RAM internă (0÷127) sau din zona SFR (128÷255).
@Ri - locaţia de 8 biţi a memoriei RAM interne (0÷255), adresată indirect prin registrele
R0 sau R1 ale bancului de registre curent.
#data - constantă de 8 biţi inclusă în instrucţiune
#data16 - constantă de 16 biţi inclusă în instrucţiune
addr16 - adresă de 16 biţi din spaţiul de memorie program
addr11 - adresă de 11 biţi dintr-o pagină de 2Ko de memorie program
rel - deplasament de 8 biţi, cu semn (-128127)
bit - adresa unui bit dintr-o locaţie din zona RAM internă sau SFR, adresabilă pe bit.
14
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
Instrucţiuni aritmetice
1 ADD A,Rn Add register to accumulator (A) (A) + (Rn), 0 0 1 0 1 r r r 1
n
n = 0÷7
i = 0,1
6 ADDC A,direct Add direct byte to A with carry (A) (A) + (C) + +(direct) 0 0 1 1 0 1 0 1 1
flag direct address
7 ADDC A,@Ri Add indirect RAM to A with carry (A) (A) + (C) +((Ri)) 0 0 1 1 0 1 1 i 1
flag
i = 0,1
15
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
10 SUBB A,direct Subtract direct byte from A with (A) (A) - (C) - 1 0 0 1 0 1 0 1 1
borrow direct address
- (direct)
11 SUBB A,@Ri Subtract indirect RAM from A with (A) (A) - (C) - 1 0 0 1 0 1 1 i 1
borrow
- ((Ri)), i = 0,1
16
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
17
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
[(AC)=1] },
atunci (A3÷0)(A3÷0)+6.
Dacă { [(A7÷4)>9]
Instrucţiuni logice
25 ANL A,Rn AND register to A (A) (A) (Rn), 0 1 0 1 1 r r r 1
n = 0÷7 n
18
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
data
data
19
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
data
20
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
Instrucţiuni de transfer
50 MOV A,Rn Move register to A (A) (Rn), n = 0÷7 1 1 1 0 1 r r r 1
n
21
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
22
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
data
LOW (addr16)
23
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
24
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
84 ANL C,bit AND direct bit to carry flag (C) (C) (bit) 1 0 0 0 0 0 1 0 2
bit address
25
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
26
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
Instrucţiuni de ramificare
90 ACALL addr11 Absolute subroutine (PC) (PC) +2 a10 a9 a81 0 0 0 1 2
call a7 a6 a5 a4 a3 a2 a1 a0
(SP) (SP) +1
((SP)) (PC7÷0)
(SP) (SP) +1
((SP)) (PC15÷8)
(PC10÷0) addr11
((SP)) (PC7÷0)
(SP) (SP) +1
((SP)) (PC15÷-8)
(PC) addr16
27
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
(SP) (SP) -1
(PC7÷0) ((SP))
(SP) (SP) -1
(SP) (SP) -1
(PC7÷0) ((SP))
(SP) (SP) -1
LOW (addr16)
28
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
(PC) +rel
101 JNC rel Jump if carry flag is not set (PC) (PC) +2 0 1 0 1 0 0 0 0 2
rel. address
Dacă (C) = 1, atunci
(PC) (PC) +rel
29
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
103 JNB bit,rel Jump if direct bit is not set (PC) (PC) +3 0 0 1 1 0 0 0 0 2
bit address
Dacă (bit) = 0, atunci
rel. address
(PC) (PC) +rel
104 JBC bit,rel Jump if direct bit is set and (PC) (PC) +3 0 0 0 1 0 0 0 0 2
clear bit bit address
Dacă (bit) = 1, atunci
rel. address
(bit) 0 şi
(PC) (PC) + rel
30
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
31
Nr. Formatul
Mnemonica Descrierea instrucţiunii Nr. cicl.
crt. instrucţiunii
32
Instrucţiune C OV AC
Instrucţiune C OV AC
33
3.3.4. Elemente de programare în limbaj de asamblare
Sunt incluse în medii software integrate de dezvoltare a aplicaţiilor, împreună cu compilatoare C, editoare
de legături, simulatoare, depanatoare şi alte programe utilitare.
O versiune gratuita de evaluare produsă de firma Keil Software Inc. poate fi descărcată de la adresa
http://www.keil.com.
34
În cele ce urmează se prezintă principalele directive de asamblare şi reguli sintactice de scriere a fişierelor
sursă, aşa cum sunt ele definite de macroasamblorul ASM51.
Din punct de vedere logic, un program poate avea acces la mai multe tipuri de segmente de memorie:
de cod (CODE);
de date externe (DATA);
de date externe (XDATA);
de date interne (IDATA);
de biţi în memoria RAM internă (BIT).
Exemplu:
?RELCOD SEGMENT CODE ; ?RELCOD este un segment de cod relocabil
35
CSEG AT 001Bh ; forţează amplasarea secvenţei de cod care urmează
;la adresa 001Bh (segment de cod absolut)
;....................
?RELDATA SEGMENT DATA
ORG exp – forţează amplasarea următoarei instrucţiuni la un deplasament dat de expresia exp faţă de
adresa de început a modulului de program curent.
const EQU exp (EQUate) - atribuie în mod permanent constantei, cu numele simbolic const, valoarea dată
de expresia exp (o expresie numerică, logică sau un alt nume simbolic).
cstemp SET exp - atribuie în mod temporar constantei, cu numele simbolic cstemp, valoarea dată de
expresia exp.
36
[etich:] DB listă (Define Byte) – definire şi iniţializare zonă de memorie la nivel de octet.
[etich:] DW lista (Define Word) - definire şi iniţializare zonă de memorie la nivel de cuvânt: octetul mai
semnificativ se memorează la adresa mai mică (invers decât la microprocesoarele de uz general).
[etich:] DBIT lista (Define Bit) - definire şi iniţializare zonă de memorie la nivel de bit: în listă se află de
obicei valori binare, 0 sau 1.
[etich:] DS exp (Define Storage) – rezervare statică de spaţiu de memorie neiniţializată, la nivel de octet.
PUBLIC lista – declarare simboluri publice, accesibile din alte module sursă;
EXTRN lista – declarare simboluri externe, pot fi utilizate în modulul sursă curent fără a fi definite (trebuie
definite într-un alt modul sursă şi declarate acolo de tip public).
37
END - indică sfârşitul fişierului sursă, fiind delimitatorul său final. Detectarea sa de către asamblor va
determina sfârşitul unei faze (treceri) a asamblării.
Formatul fişierului sursă este similar cu cel discutat la programarea în asamblare la 8085.
<COD> := MOVX|ADDC|PUSH|....|ORG|...|DBIT
<ARGUMENT>::= <CONSTANTA>|<SIMBOL>|
<SIMBOL><OP><ARGUMENT>|
<CONSTANTA><OP><ARGUMENT>
<OP> ::= + | - | * | /
38
Câmpul operand poate specifica:
un nume de registru;
o adresă de SFR;
o constantă numerică sau simbolică de 1 sau 2 octeţi;
o etichetă dintr-un segment de cod sau de date;
o expresie aritmetică;
39
2. O constantă hexazecimală, care de asemenea trebuie să înceapă cu ‘#’ şi cu o cifră (09) şi să se
termine cu litera 'h’ (sau ‘H’).
et2: MOV DPTR,#0FF00h ; Poziţionează pointerul de date externe la FF0016.
3. O constantă octală care trebuie să înceapă cu ‘#’ şi să se termine cu litera ‘q’ (‘Q’).
MOV A,#72q ; Iniţializează registrul A cu constanta 728 = 3A16 = 5810
4. O constantă binară, care trebuie să înceapă cu ‘#’ şi să se termine cu litera ‘b’ (‘B’).
AND #00111010b ; ŞI logic între acumulator şi constanta 001110102 = 728 = 3A16.
5. Valoarea curentă a contorului de program (PC) sau adresa instrucţiunii curente, care se specifică prin
caracterul ‘$’.
LJMP $+8 ; Salt în program peste 8 locaţii de memorie, la adresa curentă +8.
40
7. Numele unei constante simbolice căreia asamblorul i-a atribuit o valoare numerică.
val: EQU #40h
ADD A,val ; Adună la registrul A valoarea constantei “val”, definite anterior (40h).
8. Numele unei adrese simbolice (etichete), definite în segmentul de cod sau de date.
MOV DPTR,contor
MOVX A,@DPTR ; Încarcă în acumulator octetul de la adresa “contor”.
bucla: DEC A ; Decrementează conţinutul acumulatorului.
9. Numele unui registru SFR, adresa unei locaţii de memorie de RAM interne adresate direct sau o
adresă de bit.
PUSH ACC ; depune pe stivă conţinutul registrului A (văzut ca SFR, cu adresa 0E0h)
POP DPH ; extrage din stivă un octet pe care îl încarcă în DPH
PUSH 00h ; Pune pe stivă conţinutul registrului R0 (adresa de RAM internă 00h)
41
POP 40h ; Extrage din stivă un octet, pe care îl încarcă în memoria RAM internă,
; la adresa 40h
SETB ACC.0 ; Setează bitul cel mai puţin semnificativ al registrului acumulator.
MOV 21h,C ; Înscrie valoarea flag-ului C în bitul cu adresa 21h.
10 . Expresii aritmetice şi logice - folosesc toate tipurile de date descrise mai sus şi care constituie
operanzii expresiei.
Operanzii sunt conectaţi cu ajutorul operatorilor:
42
Operatorii SHL şi SHR produc deplasarea liniară a primului operand spre stânga, respectiv spre dreapta, cu
un număr de poziţii egal cu valoarea celui de-al doilea operand. În partea opusă deplasării se introduc un
număr de zerouri egal cu numărul de deplasări.
Ordinea în care sunt executate operaţiile dintr-o expresie este următoarea:
1. expresiile dintre paranteze,
2. LOW, HIGH,
3. *, /, MOD, SHL, SHR,
4. +, -,
5. NOT,
6. AND,
7. OR, XOR.
Operatorii MOD, SHL, SHR, NOT, AND, OR şi XOR trebuie separaţi de operanzi cu cel puţin un blanc.
Comentariul
- este un câmp este opţional;
- este alcătuit dintr-un şir de caractere alfanumerice;
- utilizat de programator pentru descrierea operaţiei executate de respectiva instrucţiune.
- trebuie precedat de un caracter ‘;’, care îl separă de câmpul operand.
- de regulă acesta este precedat, pentru aliniere, de mai multe blancuri sau tabulatori (‘ ‘, TAB);
- se poate întinde pe mai multe rânduri, dar fiecare rând trebuie să înceapă cu un delimitator ‘;’.
43