curs 4 - program area in limbaj de asamblare

Upload: mihai-nechita

Post on 09-Jul-2015

89 views

Category:

Documents


4 download

TRANSCRIPT

Curs 4Programarea microprocesorului 8085A n limbaj de asamblare4.1. Limbajul de asamblare al microprocesorului 8085A Limbaj simbolic - instruciuni executabile 4.1.1. Formatul instruciunilor Organizare pe octet: - 1, 2 sau 3 octei - n ordinea cresctoare a adreselor (PC e incrementat) Primul octet opcod generalizat Urmtorii octei operanzi sau adrese de operanzi

msb byte 1 D7 D6 D5 D4 D3 D2 D1

lsb D0 OPCODE

a) instruciune de 1 octetbyte 1 byte 2 D7 D7 D6 D6 D5 D5 D4 D4 D3 D3 D2 D2 D1 D1 D0 D0 OPCODE 8-BIT DATA/ ADDRESA

b) instruciune de 2 octeibyte 1 byte 2 byte 3 D7 D7 D7 D6 D6 D6 D5 D5 D5 D4 D4 D4 D3 D3 D3 D2 D2 D2 D1 D1 D1 D0 D0 D0 OPCODE 16-BIT DATA / ADDRESA

c) instruciune de 3 octeiFormatul instruciunilor la P 8085

4.1.2. Moduri de adresare 6 moduri de adresare: Adresare implicit (cu registru specific): - opcodul indic implicit localizarea operandului; - operandul se afl ntr-unul din registrele interne speciale ale P (A, PC, SP) sau n CY. Exemple: ADD B ; Add B with accumulator: (A)(A)+(B) operand localizat implicit n acumulator. STC ; Set Carry: CY 1 - fanionul CY adresat implicit. Avantaje: - reducerea dimensiunii codului; - micorarea duratei de execuie. Adresarea registrelor: - operandul se poate afla n unul din registrele interne ale P (A, B, C, D, E, H sau L); - instruciunea specific explicit registrul n care se afl operandul.

D7 O

D6 O

D5 D

D4 D

D3 D

D2 S

D1 S

D0

S

opcod generalizat

cod operaie

cod registru destinaie

cod registru surs

DDD sau SSS 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1

Registru B C D E H L M (*) A

Exemplu: MOV r1,r2 ; Move r2 to r1: (r1) (r2), r1 i r2 - oricare din registrele A, B, C, D, E, H i L; Avantaje suplimentare: - flexibilitate sporit. Adresarea imediat: - operandul este o constant; - operandul (8 sau 16 bii) e dispus n memoria program, imediat dup codul operaiei; - operandul este adresat cu registrul PC. Exemple: MVI A,data8 ; Move Immediate data8=byte2 into accumulator: (A) (byte 2) LXI H,data16 ; Load register pair HL with data16= byte3::byte2: (L) byte2, (H) byte 3 - sunt necesare nc 1 sau 2 cicluri de citire memorie pentru ncrcarea operandului. - se utilizeaz la iniializarea registrelor interne cu valori predefinite. Adresarea direct: - operandul este o variabil de 8 sau 16 bii, amplasat oriunde n memorie, la o adres stabilit la momentul asamblrii programului; - octeii 2 i 3 ai instruciunii conin adresa la care se afl operandul; - adresa operandului este ncrcat n W-Z n dou CM de citire memorie; - urmeaz adresarea operandului cu W-Z i efectuarea transferului propriu-zis. Exemple: LDA addr SHLD addr ; Load Accumulator from addr=byte3::byte2: (A) (byte3::byte2) ; Store H and L at addr=byte3::byte2: (byte3::byte2)(L), ; (byte3::byte2 + 1) (H)

- adresa variabilei trebuie cunoscut la momentul scrierii programului (alocare static) - se utilizeaz i n cazul dialogului cu dispozitivele I/E: adresele porturilor de I/E sunt cunoscute. Exemple: IN port ; Input from port=byte2: (A) (byte 2) OUT port ; Output to port=byte2: (byte 2) (A) - Adresa portului - 8 bii - este ncrcat, n cel de-al doilea ciclu al instruciunii (dup FETCH), n ambele registre, W i Z. - Coninutul acestor dou registre se depune, ca i n cazul adresrii memoriei, pe liniile A15A0. Consecine: - porturile I/E pot fi adresate att pe liniile inferioare, A7A0, ct i pe liniile superioare ale magistralei de adres, A15A8; - ntruct liniile inferioare sunt folosite i pentru adresarea memoriei, pentru adresarea porturilor se prefer de regul A15A8, din considerente de ncrcare a MA (fan-out). Adresarea indirect sau cu registru pereche: - operandul este o variabil de 8 sau 16 bii, amplasat oriunde n memorie, la o adres calculat la momentul execuiei programului; - adresa operandului se afl deja ntr-un registru pereche; - urmeaz adresarea operandului cu registrul pereche i efectuarea transferului. - permite referirea la operanzi din memorie a cror adres nu este cunoscut la momentul scrierii programului, ci se determin la momentul execuiei acestuia, permind lucrul cu variabile alocate dinamic n spaiul de memorie.

- cele mai multe instruciuni cu adresare indirect folosesc registrul pereche H (format din registrele simple H i L), referit n instruciuni prin notaia M (SSS sau DDD = 1 1 0). Exemple: MOV A,M ; LDAX rp ; STAX rp ; PUSH rp ; POP rp ; Move memory to Accumulator: (A) ((H)(L)) Load Acc. indirect from memory addresed with register pair rp: (A) ((rp)). Store Acc. indirect to memory addresed with register pair rp: ((rp)) (A) Push rp into stack Pop rp from stack

Adresarea combinat: - utilizarea mai multor moduri de adresare n cadrul aceleiai instruciuni. Exemple: LDA addr MOV A,M CALL addr RST n ; ; ; ; implicit (Acc.) + direct (addr) la registru (A) + indirect (M) direct (addr) +indirect (SP) direct (n) + indirect (SP)

4.1.3. Setul de instruciuni Toate instruciunile P 8085 au codul operaiei pe un singur octet. Din totalul celor 28 = 256 de combinaii posibile se folosesc numai 246. 80 de tipuri de nume (mnemonici) de instruciuni 74 de tipuri de operaii

Categorii de instruciuni: a) instruciuni de transfer - copierea datelor ntre registre sau ntre registre i memorie; aceste instruciuni nu afecteaz fanioanele de condiie. b) instruciuni aritmetice - operaii aritmetice de adunare i scdere sau de incrementare/ decrementare cu cuvinte din registre sau din memorie. Instruciunile din aceast categorie afecteaz toate fanioanele de condiii. c) instruciuni logice - operaii logice asupra cuvintelor binare. Toi indicatorii de condiie sunt afectai (CY i AC sunt resetai). d) instruciuni de ramificare instruciunilor. Ramificrile fanioanelor. - schimbarea succesiunii uniforme de pot fi necondiionate sau condiionate execuie a de valorile

Exist 8 condiii distincte referitoare la valorile fanioanelor Z, CY, P i S: NZ (Not Zero) Z (Zero) NC (Not Carry) C (Carry) PO (Parity Odd) PE (Parity Even) P (Plus) M (Minus) rezultatul ultimei operaii aritmetice/logice este diferit de 0 (Z=0); rezultatul este 0 (Z=1); nu a existat transport/mprumut(CY=0); a existat transport/mprumut (CY=1); rezultatul are un numr impar de bii 1 (P=0); numrul de bii 1 al rezultatului este par (P=1); n acumulator se afl un numr nenegativ (S=A7=0); n acumulator se afl un numr negativ (S=A7=1).

e) instruciuni de lucru cu stiva, de I/E i de comand a microprocesorului permit accesul la stiv, la porturile de I/E i controleaz regimurile microprocesorului.

Nr. Mnemonica crt. instruciunii

Descrierea instruciunii Instruciuni de transfer

Mod(uri) de adresare

Flaguri afectate

CM/ stri

1 MOV r1,r2 2 MOV r,M 3 MOV M,r 4 MVI r,data8 5 MVI M,data8

MOVe reg. to reg. MOVe Mem. to reg. MOVe reg. to Mem. MoVe to reg. Immed. MoVe to Mem. Immed.

(r1 )(r2) (r)((H)(L)) ((H)(L))(r) (r)data8 ((H)(L))data8 (rL)low(data16) (rH)high(data16) (A)(addr) (addr)(A) (L)(addr) (H)(addr+1) (addr)(L) (addr+1)(H) (A)((rp)), rp=B,D ((rp))(A), rp=B,D (H)(D), (L)(E)

la registru ind.+la reg. la reg.+ind. imed.+la reg. imed.+ind. imed.+la reg. direct+impl. impl.+dir. direct+impl. impl.+direct ind.+impl. ind.+impl. implicit

-

1/4 2/7 2/7 2/7 3/10 3/10 4/13 4/13 5/16 5/16 2/7 2/7 1/4

6 LXI rp,data16 Load reg. pair Immed. 7 LDA addr 8 STA addr 9 LHLD addr 10 SHLD addr 11 LDAX rp 12 STAX rp 13 XCHG LoaD Acc. direct Store Acc. direct Load H and L Direct Store H and L Direct LoaD Acc. indirect Store Acc. indirect eXCHanGe H,L with D,E

Instruciuni aritmetice 14 ADD r 15 ADD M 16 ADI data8 17 ADC r 18 ADC M 19 ACI data8 20 SUB r 21 SUB M 22 SUI data8 23 SBB r 24 SBB M 25 SBI data8 26 INR r 27 INR M 28 DCR r 29 DCR M 30 INX rp 31 DCX rp 32 DAD rp 33 DAA ADD reg. to acc. ADD Mem. to acc. ADd Immed. to acc. ADd reg. to A with Cy ADd mem. to A with Cy Add Immed. to A with CY SUBtract register from A SUBtract Memory from A Subtract Immed. from A SuB. reg. fr. A w. Borrow (A) (A)+(r) (A)(A)+((H)(L)) (A)(A)+data8 (A)(A)+(r)+(CY) (A)(A)+data8+(CY) (A)(A) - (r) (A)(A) - ((H)(L)) (A)(A) - data8 (A)(A) - (r) - (CY) impl.+la reg. impl.+ind. impl.+imed. impl.+la reg. impl.+imed. impl.+la reg. impl.+ind. impl.+imed. impl.+la reg. impl.+ind. impl.+imed. la registru indirect la registru indirect la registru la registru toate toate toate toate toate toate toate toate toate toate toate toate toate toate toate toate CY toate 1/4 2/7 2/7 1/4 1/4 2/7 1/4 2/7 2/7 1/4 2/7 2/7 1/4 3/10 1/4 3/10 1/6 1/6 3/10 1/4

(A)(A)+((H)(L))+(CY) impl.+ind.

SuB. Mem. fr. A with Borr. (A)(A)-((H)(L))-(CY) Sub. Imm. Fr. A with Borr. (A)(A) - data8 - (CY) INcRement register INcRement Memory DeCRement register DeCRememt Memory INcrement register pair DeCrement register pair ADD rp to HL Decimal Adjust Accumulator (r)(r) + 1 ((H)(L))((H)(L)) + 1 (r)(r) - 1 ((H)(L))((H)(L)) - 1 (rp)(rp)+1, rp=B,D,H, sau SP (rp)(rp) - 1

(H)(L)(H)(L)+(rH)(rL) impl.+la reg. (A3 A0)>9 sau (AC)=1 (A) (A) + 6; implicit (A7 A4)>9 sau (CY)=1 (A) (A) + 6 24

Instruciuni logice 34 ANA r 35 ANA M 36 ANI data8 37 XRA r 38 XRA M 39 XRI data8 40 ORI data8 41 ORA r 42 ORA M 43 CMP r 44 CMP M 45 CPI data8 46 RLC 47 RRC 48 RAL 49 RAR 50 CMA 51 STC 52 CMC ANd reg. with A ANd Mem. with A ANd Imm. with A eXclusive oR reg. with A eXcl. oR Mem. with A eXcl. oR Immed. with A OR Immed. with A OR register with A OR Memory with A CoMPare register with A CoMPare Memory with A ComPare Immed. with A Rotate A Left with Carry (A) (A) (r) (A) (A) ((H)(L)) (A) (A) data8 (A) (A) (r) (A) (A) ((H)(L)) (A) (A) data8 (A) (A) data8 (A) (A) (r) (A) (A) ((H)(L)) (A) - (r) (A) - ((H)(L)) (A) - data8 impl.+la reg. impl.+ind. impl.+imed. impl.+la reg. impl.+ind. impl.+imed. impl.+imed. impl.+la reg. impl.+ind. impl.+la reg. impl.+ind. impl.+imed. implicit implicit implicit implicit implicit implicit implicit toate toate toate CY CY CY CY CY=1 CY Z,S,P CY=0 AC=0 1/4 2/7 2/7 1/4 2/7 2/7 2/7 1/4 2/7 1/4 2/7 2/7 1/4 1/4 1/4 1/4 1/4 1/4 1/4

(CY) (A7) (A0), (An+1) (An), n=06 (CY) (A0) (A7), Rotate A Right with CY (An+1) (An), n=06 (A0) (CY) (A7), Rotate A Left through CY (An+1) (An), n=06 (A0) (CY) (A7), Rotate A Right through CY (An+1) (An), n=06 CoMplement Acc. SeT Carry CoMplement Carry (A) (A) (CY) 1 (CY) (CY)

Instruciuni de ramificare 53 JMP addr 54 Jcc addr JuMP unconditional Jump on condition cc (PC) addr Dac cc : (PC) addr; Altfel: (PC) (PC) + 3 (SP) (SP) - 1 ((SP)) (PCH) (SP) (SP) - 1 ((SP)) (PCL) (PC) addr Dac cc: (SP) (SP) - 1 ((SP)) (PCH) (SP) (SP) - 1 ((SP)) (PCL) (PC) addr; Altfel: (PC) (PC) + 3 (PCL) ((SP)) (SP) (SP) + 1 (PCH) ((SP) + 1) (SP) (SP) + 1 Dac cc: (PCL) ((SP)) (SP) (SP) + 1 (PCH) ((SP)+1) (SP) (SP) + 1; Altfel: (PC) (PC) + 1 (SP) (SP) - 1 ((SP)) (PCH) (SP) (SP) - 1 ((SP)) (PCL) (PC) n x 8 (PCH)(H), (PCL)(L) direct direct direct + indirect + implicit direct + indirect + implicit 3/11 indirect + implicit indirect + implicit 1/5 direct + indirect + implicit implicit 3/11 3/10 3/11 5/17 3/10 3/10 1/5

55 CALL addr

CALL unconditional

5/17

56 Ccc addr

Call on condition cc

57 RET

RETurn Return on condition cc

58 Rcc

ReSTart 59 RST n n= 0, 1, 2, ..., 7 60 PCHL move HL to PC

1/5

Instruciuni de lucru cu stiva, I/E i de comand PUSH register pair on stack (SP) (SP) - 1 ((SP)) (rH) 61 PUSH rp rp = B, D sau H (SP) (SP) - 1 ((SP)) (rL) PUSH accumulator and (SP) (SP) - 1 flags on stack; ((SP)) (A) 62 PUSH PSW Flags: (SP) (SP) - 1 S Z 0 AC 0 P 0 CY ((SP)) (Flags) POP register pair off stack (rL) ((SP)) (SP) (SP) + 1 63 POP rp rp = B, D sau H (rH) ((SP)) (SP)(SP)+1 POP accumulator and Flags (Flags) ((SP)) off stack; (SP) (SP) + 1 64 POP PSW Flags: (A) ((SP)) S Z - AC - P - CY (SP) (SP) + 1 eXchange stack Top with (L) ((SP)) 65 XTHL HL (H) ((SP)+1) move HL to SP (SP) (HL) 66 SPHL Input (A) (port) 67 IN port OUTput (port) (A) 68 OUT port Enable Interrupts (INTE) 1 69 EI Disable Interrupts (INTE) 0 70 DI 71 HLT HaLT PC - blocat No OPeration (PC) (PC) + 1 72 NOP Set Interrupt Mask SOD (A7), mascheaz 73 SIM and write serial bit RST 7.5, 6.5 i 5.5 Read serial bit and (A7)SID, citete Interrupt Mask 74 RIM mtile liniilor INTR, RST 7.5, 6.5 i 5.5 la registru + indirect + implicit indirect + implicit la registru + indirect + implicit indirect + implicit implicit + indirect la registru impl.+dir. impl.+dir. implicit implicit implicit implicit 3/12

-

3/12

-

3/10

toate

3/10

-

5/16 1/6 3/10 3/10 1/4 1/4 1/7 1/4 1/4 1/4

4.2. Programarea n limbaj de asamblare Se face n cadrul fixat de programul de asamblare automat (asamblor): a) setul de instruciuni al microprocesorului (instruciuni executabile) b) directivele de asamblare (pseudoinstruciuni); c) sintaxa textului surs. Asambloare: Intel ASM80 Microsoft M80 (Macro-80) Digital Research ASM, MAC, RMAC Cross-asambloare: Dunfield D8085 Crossware Products A8085NT Cu mici diferene, toate respect aceleai reguli sintactice pentru fiierul surs i utilizeaz un trunchi comun de directive de asamblare. 4.2.1. Organizarea segmentat a codului surs Separarea codului de date amplasare n zone diferite de memorie Segmentul de cod - codul i date constante nu se modific pe parcursul execuiei; pot fi rezidente ntr-o memorie de tip ROM (memorie program). Segmentul de date - variabilele programului - se modific n timpul execuiei; amplasarea lor numai n memorii de tip RAM (memorie de date). Segmente absolute - amplasate la adrese fixe, stabilite la scrierea codului surs. Segmente relocabile - amplasate la adrese stabilite ulterior, la editarea legturilor.

Directive de segmentare: CSEG (Code SEGment) nchide segmentul curent i (re)deschide segmentul de cod relocabil. DSEG (Data SEGment) - nchide segmentul curent i (re)deschide segmentul de date relocabil. ASEG (Absolute SEGment) - nchide segmentul curent i deschide un segment absolut. Segmentele relocabile nu au nume: exist un singur segment de cod i unul singur de date. Segmentele absolute nu au nume, dar pot fi mai multe, identificate prin adresa de start. Segmentele absolute nu trebuie s se suprapun n spaiul de adrese. Asamblorul folosete cte un contor de locaii pentru fiecare segment, ce poate fi referit n program printr-un simbol predefinit (uzual $). Contorul de locaii atribuite adrese octeilor rezultai din asamblarea instruciunilor executabile i octeilor rezervai pentru date. Adresele sunt temporare segmentelor absolute. n cazul segmentelor relocabile sau definitive n cazul

Aceste adrese, mpreun cu octeii corespunztori, sunt stocai n fiierul obiect generat de asamblor. Contorul de locaii este iniializat cu 0000h la nceputul segmentului relocabil. La nceputul unui segment absolut, contorul de locaii este iniializat cu adresa de start a acestuia (sau cu 0000h dac aceasta lipsete). La nchiderea unui segment relocabil, contorul de locaii este salvat, fiind rencrcat la redeschiderea segmentului.

Exemplu: ; nceputul fiierului surs n limbaj de asamblare ; segmentul de cod relocabil (implicit, chiar dac lipsete CSEG) ; $=0000h ... DSEG ... CSEG ... DSEG ... ASEG ... ; $=t DSEG ; $=w ... ; $=w 2000h ; nchide segmentul relocabil de date i deschide un segment absolut ; $=2000h ; $=z ; nchide segmentul de cod relocabil i redeschide segmentul relocabil de date ; $=y ; $=x ; nchide segmentul de cod relocabil i deschide segmentul relocabil de date ; $=0000h ; $=y ; nchide segmentul de date relocabil i redeschide segmentul relocabil de cod ; $=x

n cadrul fiecrui segment, se poate fora modificarea numrtorului de locaii cu alt valoare dect cea care rezult n mod natural, prin incrementare. ORG exp - expresia exp precizeaz deplasamentul (offset-ul) care se adaug la adresa de nceput a segmentului, iar rezultatul se ncarc n numrtorul de locaii. Exemplu: ; nceputul fiierului surs n limbaj de asamblare CSEG ... ; nchide segmentul curent i redeschide segmentul relocabil de cod ; $=0000h ; $=x < 0100h 100h; foreaz ncrcarea numrtorului de locaii cu 0000h+100h==100h ; $=0100h 8000h; nchide segmentul curent i deschide un segment absolut la 8000h ; $=8000h ; $=x < 8040h 40h ; foreaz ncrcarea numrtorului de locaii cu 8000h+40h=8040h ; $=8040h

ORG ... ASEG ...

ORG ...

4.2.2. Constante i expresii Constante numerice ncep cu o cifr. zecimale baza 10 183 binare baza 2 10110111b octale baza 8 267Q hexazecimale - 0B7h (se adaug 0 pentru a incepe cu o cifr) ASCII #

Constante simbolice ncep cu o liter sau cu unul din caracterele speciale $ . ? @ sau _. Se definesc cu ajutorul directivelor EQU i SET: const EQU exp (EQUate) - atribuie n mod permanent constantei cu numele simbolic const valoarea dat de expresia exp (o expresie numeric sau logic). cstemp SET exp - atribuie n mod temporar constantei cu numele simbolic cstemp valoarea dat de expresia exp. Un simbol definit cu SET se poate redefini ulterior, n cadrul aceluiai fiier surs, ori de cte ori este nevoie. Asamblorul substituie numele simbolice const sau cstemp cu valorile atribuite cu ajutorul directivelor EQU i SET ele trebuie s precead orice utilizare a numelor simbolice. inainte inapoi sens ... sens set ... equ 1 equ 0 set inainte napoi ; orice apariie a simbolului sens va fi nlocuit cu 0 ; constante permanente ; constant temporar ; orice apariie a simbolului sens va fi nlocuit cu 1

Expresii aritmetice i logice - folosesc drept operanzi orice tip de constante descrise mai sus, combinai cu ajutorul operatorilor: - aritmetici: +, -, *, /, MOD (modulo) - logici: NOT, AND, OR, XOR, SHL, SHR (de deplasare la stnga sau la dreapta); - paranteze (stnga i dreapta). Expresiile sunt evaluate pe 16 bii. Reguli de preceden: 1. expresiile dintre paranteze; 2. *, /, MOD, SHL, SHR 3. +, 4. NOT 5. AND 6. OR, XOR Operatorii MOD, SHL, SHR, NOT, AND, OR i XOR trebuie separai de operanzi cu cel puin un blanc. baza intrare1 intrare2 intrare3 TRUE FALSE equ 0 equ baza+4 equ baza OR 10000000b equ (baza+intrare1)*2 EQU 1 EQU NOT TRUE

4.2.3. Organizarea datelor Date iniializate [etich:] DB lista (Define Byte) - definete valoarea numelui simbolic etich (opional) ca fiind adresa de nceput a unei zone de memorie alocat static, organizat pe octei i iniializat cu valorile numerice ale elementelor din lista. Acestea pot fi: valori numerice (0255); constante simbolice (definite anterior cu EQU sau SET); iruri de caractere ASCII ntre ghilimele simple; expresii aritmetice i logice. Directiva DB se utilizeaz de regul pentru a defini date de 1 octet, constante sau variabile iniializate static. [etich:] DW lista (Define Word) - la fel ca DB, dar zona de memorie alocat este organizat pe cuvinte de 2 octei. n list se afl de obicei valori numerice (065535) sau adrese simbolice (etichete) de instruciuni ori de date, definite n fiierul surs; octetul mai puin semnificativ se memoreaz la adresa mai mic. Date neiniializate [etich:] DS exp (Define Storage) - definete valoarea numelui simbolic etich (opional) ca fiind adresa de nceput a unei zone de memorie neiniializat, alocat static, de dimensiune egal cu valoarea numeric a expresiei exp. n cmpul operand, exp, se poate afla un numr, o constant simbolic definit anterior (cu EQU sau SET) sau o expresie aritmetic.

DSEG mesaj: buffer: lung : count: ptrbuf: ptrmes: DB DS DB DS DB DB DW Buffer de date,0 100 $-buffer 1 LOW(buffer) HIGH(buffer) mesaj

4.2.4. Definirea referinelor ntre modulele obiect Program format din mai multe fiiere surs n limbaj de asamblare - apelarea unor subrutine definite ntr-un alt fiier surs. - accesul la date definite n alt fiier surs. PUBLIC lista face cunoscut o list cu numele simbolice accesibile din alte fiiere surs. EXTRN lista precizeaz c numele simbolice din list sunt definite n alte fiiere surs. Editorul de legturi rezolv referinele ntre module la momentul generrii codului executabil. Alte directive de asamblare: - asamblare condiionat - control al coninutului fiierului listing

4.3.2. Programarea cu macroinstruciuni Tehnic de optimizare a codului surs. Secvene identice care apar de mai multe ori ntr-un program, eventual cu ali parametri. O astfel de secven se poate defini ca o macroinstruciune. Utilizarea macroinstruciunilor duce la o scurtare i la o modularizare a fiierului surs. Definirea macroinstruciunii (n limbajul Macro-80): nume: MACRO arg1, arg2, ... ... ENDM ; nceputul macroinstruciunii. ; Corpul macroinstruciunii. ; Sfritul macroinstruciunii.

Odat definit, o macroinstruciune se poate referi ori de cte ori este nevoie, prin simpla inserare n program a numelui i a parametrilor acesteia. Exemplu: O macroinstruciune de adunare a dou locaii de memorie de 1 octet, iar rezultatul s se regseasc n acumulator. Folosind aceast macroinstruciune: - s se adune coninutul locaiei a1 cu octetul de la adresa a2, rezultatul s se depun la a3 - s se adune octeii de la adresele b1 i b2, iar rezultatul s se memoreze la adresa b3.

ADUNA:

MACRO par1, par2 LDA par1 MOV B,A LDA par2 ADD B ENDM

; Definirea macroinstruciunii ADUNA, cu 2 parametri formali. ; ncrcarea n acumulator a primului termen. ; Primul termen este memorat n B. ; Se ncarc cel de-al doilea termen (de la adresa par2). ; Se adun cu primul termen; rezultatul se obine n A. ; Sfritul macroinstructiunii ADUNA.

;

... ADUNA STA a3 ADUNA STA b3 b2,b1 a1,a2 ; Calculeaz (a1)+(a2) printr-o referire a macroinstruciunii ADUNA. ; Depune rezultatul n memorie, la adresa a3. ; Calculeaz (b2)+(b1). ; Depune rezultatul n memorie, la adresa b3.

La asamblare, macroasamblorul va expanda toate referirile la macroinstruciune: - va nlocui linia de referire cu corpul macroinstruciunii - argumentele formale vor fi substituite cu parametrii efectivi. LDA a1 MOV B,A LDA a2 ADD B STA a3 LDA b1 MOV B,A LDA b2 ADD B STA b3 ; ncrcarea n acumulator a primului termen. ; Primul termen este memorat n B. ; Se ncarc cel de-al doilea termen (de la adresa par2). ; Se adun cu primul termen; rezultatul se obine n A. ; Depune rezultatul n memorie, la adresa a3. ; ncrcarea n acumulator a primului termen. ; Primul termen este memorat n B. ; Se ncarc cel de-al doilea termen (de la adresa par2). ; Se adun cu primul termen; rezultatul se obine n A. ; Depune rezultatul n memorie, la adresa b3.

4.3.3. Programarea cu subrutine Utilizarea macroinstruciunilor este avantajoas pentru secvene scurte. Secvenele lungi, referite frecvent, determin creterea exagerat a dimensiunii codului. n astfel de situaii, se utilizeaz subrutine. Subrutina: - succesiune de instruciuni cu unul sau mai multe puncte de intrare etichetate i cu unul sau mai multe puncte de ieire; - realizeaz o anumit funcie: operaii de I/E, conversii al formatului datelor, operaii matematice n virgul fix sau mobil etc.; - poate fi apelat ori de cte ori este nevoie; - pentru ea se aloc memorie numai o singur dat. - la terminare trebuie s se rentoarc n programul apelant, indiferent de locul de unde este apelat. Spre deosebire de rutinele de ntreruperi, punctele din program n care este apelat o subrutin sunt stabilite la momentul scrierii programului. subrutinele obinuite nu necesit neaprat salvarea tuturor regitrilor modificai, aa cum este obligatoriu n cazul rutinelor de tratare a ntreruperilor. spre deosebire de rutinele de tratare a ntreruperilor, subrutinele obinuite pot primi parametri de la programul apelant i pot returna rezultate ctre acesta.

Realizarea legturii dintre programul apelant i subrutine:

Programul apelant

CALL subrutina Instruciunea urmtoare

subrutina: ... RET ...

Pentru creterea lizibilitii codului surs, fiecare subrutin trebuie documentat la definire, precizndu-se: - numele i funcia ndeplinit; - modul n care sunt primii parametrii de intrare; - modul n care rezultatele sunt returnate programului apelant; - registrele modificate n cadrul subrutinei.

Exemplu: Subrutin de transfera unui numr de octei (nrb) de la adresa sursa la adresa dest. Se folosesc registrele pereche H i D pentru adresarea indirect a locaiilor din zonele de memorie surs, respectiv destinaie, iar registrul C va contoriza numrul de octei rmai de transferat. Subrutina se va numi memcpy (copie o zon de memorie n alt zon). ; Programul apelant ; ... LXI H,sursa LXI D,dest MVI C,nrb CALL memcpy ; ...

; ; ; ; ;

Se ncarc n registrul pereche H adresa zonei surs. Se iniializeaz DE cu adresa de nceput a zonei destinaie. Se ncarc n C numrul iniial de octei de transferat. Se apeleaz rutina de transfer. Instruciunea urmtoare, la care se revine cu RET.

; MEMCPY - rutina de copiere a unei zone de memorie n alt zon ; Intrare: HL = adresa de nceput a zonei surs ; DE = adresa de nceput a zonei destinaie ; C = numrul de octei de transferat. ; Ieire: zona de memorie destinaie are acelai coninut cu zona de memorie surs. ; Distruge: coninutul registrelor A, C, DE, HL, indicatorii de condiie. memcpy: MOV STAX INX H INX D DCR C JNZ RET A,M D ; ; ; ; ; ; ; ; Punctul de intrare n subrutin, identic cu numele subrutinei. Citete n A octetul din zona surs, de la adresa din HL. Inscrie octetul din A n zona destinaie, la adresa din DE. Incrementeaz registrul pointer pentru zona surs (HL). Incrementeaz registrul pointer n zona destinaie (DE). Decrementeaz numrul de octei rmai de transferat. Dac mai sunt octei, sare la nceputul subrutinei; altfel, revine n programul apelant

memcpy

n corpul subrutinei se modific coninutul unor registre interne sau indicatorii de condiie. Programul apelant dorete conservarea lor. Programul apelant sau subrutina apelat - salvarea/refacerea lor din stiv. Exemplu: ; Programul apelant ; ... CALL subrutina ; ... ; SUBRUTINA ; Intrare: . . . ; Ieire: . . . ; Distruge: Nimic subrutina: PUSH PUSH PUSH PUSH ... POP POP POP POP RET H D B PSW PSW B D H ; ; ; ; Salveaz Salveaz Salveaz Salveaz pe pe pe pe stiv stiv stiv stiv acumulatorul i indicatorii de condiie. coninutul registrului pereche B (B i C). D (D i E). H (H i L). ; ; ; ; Starea registrelor dinainte de apelul subrutinei. Se apeleaz subrutina. Starea registrelor de dup revenirea din subrutin este aceeai cu cea de dinaintea apelului subrutinei.

; corpul subrutinei - modific registrele i indicatorii de condiie. ; ; ; ; Reface Reface Reface Reface de de de de pe pe pe pe stiv stiv stiv stiv H i L. D. B. acumulatorul i indicatorii de condiie.

; Revine din subrutin, cu coninutul registrelor neschimbat.

Transferul parametrilor i a rezultatelor ntre programul apelant i subrutine Prin intermediul registrelor interne ale microprocesorului Parametrii formali - registre interne ale microprocesorului. Parametrii efectivi de intrare ai subrutinei sunt ncrcai de programul apelant n registre interne ale microprocesorului naintea apelului. Subrutina ncarc rezultatele n registre interne ale microprocesorului. La revenire, programul apelant utilizeaz rezultatele din registre. Prin intermediul unor zone de memorie - atunci cnd numrul i/sau dimensiunea parametrilor este mai mare dect numrul de registre ale microprocesorului. Datele pot fi memorate la adrese succesive de memorie, iar adresa zonei poate fi comunicat subrutinei prin intermediul unui registru pereche. Cea mai simpl metod de transfer al datelor prin intermediul memoriei utilizeaz stiva; adresa de nceput a stivei este coninut implicit de registrul SP, accesibil att programului apelant ct i subrutinei apelate. Programarea cu subrutine: - optimizeaz programele surs (modularizare) i codul executabil generat, contribuind la utilizarea eficient a memoriei. - crete timpul de execuie a programului: fiecare apel de subrutin necesitnd execuia suplimentar a cel puin unei instruciuni CALL i a unei instruciuni RET; - necesit existena stivei, deci impune prezena n sistem a unei memorii de tip RAM.