Sunteți pe pagina 1din 26

Curs 4

Programarea microprocesorului 8085A n limbaj de asamblare


4.1. Limbajul de asamblare al
microprocesorului 8085A

msb
byte 1

D7

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

lsb
D6

D5

D4

D3

D2

D1

D0

OPCODE

a) instruciune de 1 octet
byte 1

D7

D6

D5

D4

D3

D2

D1

D0

OPCODE

byte 2

D7

D6

D5

D4

D3

D2

D1

D0

8-BIT DATA/
ADDRESA

OPCODE

b) instruciune de 2 octei
byte 1

D7

D6

D5

D4

D3

D2

D1

D0

byte 2

D7

D6

D5

D4

D3

D2

D1

D0

byte 3

D7

D6

D5

D4

D3

D2

D1

D0

16-BIT
DATA /
ADDRESA

c) instruciune de 3 octei
Formatul 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

D6

D5

D4

D3

D2

D1

D0

cod
operaie

cod registru
destinaie

cod registru
surs

opcod
generalizat

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

Mod(uri) de
adresare

Flaguri
afectate

CM/
stri

la registru

1/4

Instruciuni de transfer
1 MOV r1,r2

MOVe reg. to reg.

(r1 )(r2)

2 MOV r,M

MOVe Mem. to reg.

(r)((H)(L))

ind.+la reg.

2/7

3 MOV M,r

MOVe reg. to Mem.

((H)(L))(r)

la reg.+ind.

2/7

4 MVI r,data8

MoVe to reg. Immed.

(r)data8

imed.+la reg.

2/7

5 MVI M,data8

MoVe to Mem. Immed.

((H)(L))data8

imed.+ind.

3/10

6 LXI rp,data16 Load reg. pair Immed.

(rL)low(data16)
(rH)high(data16)

imed.+la reg.

3/10

7 LDA addr

LoaD Acc. direct

(A)(addr)

direct+impl.

4/13

8 STA addr

Store Acc. direct

(addr)(A)

impl.+dir.

4/13

9 LHLD addr

Load H and L Direct

(L)(addr)
(H)(addr+1)

direct+impl.

5/16

10 SHLD addr

Store H and L Direct

(addr)(L)
(addr+1)(H)

impl.+direct

5/16

11 LDAX rp

LoaD Acc. indirect

(A)((rp)), rp=B,D

ind.+impl.

2/7

12 STAX rp

Store Acc. indirect

((rp))(A), rp=B,D

ind.+impl.

2/7

13 XCHG

eXCHanGe H,L with D,E

(H)(D), (L)(E)

implicit

1/4

Instruciuni aritmetice
14 ADD r

ADD reg. to acc.

(A) (A)+(r)

impl.+la reg.

toate

1/4

15 ADD M

ADD Mem. to acc.

(A)(A)+((H)(L))

impl.+ind.

toate

2/7

16 ADI data8

ADd Immed. to acc.

(A)(A)+data8

impl.+imed.

toate

2/7

17 ADC r

ADd reg. to A with Cy

(A)(A)+(r)+(CY)

impl.+la reg.

toate

1/4

18 ADC M

ADd mem. to A with Cy

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

toate

1/4

19 ACI data8

Add Immed. to A with CY

(A)(A)+data8+(CY)

impl.+imed.

toate

2/7

20 SUB r

SUBtract register from A

(A)(A) - (r)

impl.+la reg.

toate

1/4

21 SUB M

SUBtract Memory from A

(A)(A) - ((H)(L))

impl.+ind.

toate

2/7

22 SUI data8

Subtract Immed. from A

(A)(A) - data8

impl.+imed.

toate

2/7

23 SBB r

SuB. reg. fr. A w. Borrow

(A)(A) - (r) - (CY)

impl.+la reg.

toate

1/4

24 SBB M

SuB. Mem. fr. A with Borr. (A)(A)-((H)(L))-(CY)

impl.+ind.

toate

2/7

25 SBI data8

Sub. Imm. Fr. A with Borr. (A)(A) - data8 - (CY)

impl.+imed.

toate

2/7

26 INR r

INcRement register

(r)(r) + 1

la registru

toate

1/4

27 INR M

INcRement Memory

((H)(L))((H)(L)) + 1

indirect

toate

3/10

28 DCR r

DeCRement register

(r)(r) - 1

la registru

toate

1/4

29 DCR M

DeCRememt Memory

indirect

toate

3/10

30 INX rp

INcrement register pair

31 DCX rp

DeCrement register pair

((H)(L))((H)(L)) - 1
(rp)(rp)+1,
rp=B,D,H, sau SP
(rp)(rp) - 1

32 DAD rp

ADD rp to HL

33 DAA

Decimal Adjust
Accumulator

la registru

1/6

la registru

1/6

(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

CY
toate

3/10
1/4

Instruciuni logice
34 ANA r

ANd reg. with A

(A) (A) (r)

impl.+la reg.

1/4

35 ANA M

ANd Mem. with A

(A) (A) ((H)(L))

impl.+ind.

2/7

36 ANI data8

ANd Imm. with A

(A) (A) data8

impl.+imed.

2/7

37 XRA r

eXclusive oR reg. with A

(A) (A) (r)

impl.+la reg.

38 XRA M

eXcl. oR Mem. with A

(A) (A) ((H)(L))

impl.+ind.

39 XRI data8

eXcl. oR Immed. with A

(A) (A) data8

impl.+imed.

40 ORI data8

OR Immed. with A

(A) (A) data8

impl.+imed.

2/7

41 ORA r

OR register with A

(A) (A) (r)

impl.+la reg.

1/4

42 ORA M

OR Memory with A

(A) (A) ((H)(L))

impl.+ind.

2/7

43 CMP r

CoMPare register with A

(A) - (r)

impl.+la reg.

toate

1/4

44 CMP M

CoMPare Memory with A

(A) - ((H)(L))

impl.+ind.

toate

2/7

45 CPI data8

ComPare Immed. with A

(A) - data8

impl.+imed.

toate

2/7

46 RLC

Rotate A Left with Carry

implicit

CY

1/4

implicit

CY

1/4

implicit

CY

1/4

implicit

CY

1/4

47 RRC
48 RAL
49 RAR

(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

Z,S,P
CY=0
AC=0

1/4
2/7
2/7

50 CMA

CoMplement Acc.

(A) (A)

implicit

1/4

51 STC

SeT Carry

(CY) 1

implicit

CY=1

1/4

52 CMC

CoMplement Carry

(CY) (CY)

implicit

CY

1/4

Instruciuni de ramificare
53 JMP addr

JuMP unconditional

54 Jcc addr

Jump on condition cc

55 CALL addr

56 Ccc addr

57 RET

CALL
unconditional

Call on condition cc

RETurn
Return on condition cc

58 Rcc

ReSTart
59 RST n
n= 0, 1, 2, ..., 7
60 PCHL

move HL to PC

(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

3/10

3/10
1/5

direct +
indirect +
implicit

5/17

5/17

direct +
indirect +
implicit
3/11
indirect +
implicit

3/10
-

3/11

indirect +
implicit
1/5
direct +
indirect +
implicit
implicit

3/11

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

3/12

indirect +
implicit

3/12

la registru +
indirect +
implicit

3/10

toate

3/10

5/16

1/6
3/10
3/10
1/4
1/4
1/7
1/4

implicit

1/4

implicit

1/4

indirect +
implicit
implicit +
indirect
la registru
impl.+dir.
impl.+dir.
implicit
implicit
-

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.

cazul

segmentelor

relocabile

sau

definitive

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

; $=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

...
DSEG

; $=z
; nchide segmentul de cod relocabil i redeschide segmentul relocabil de date
; $=y

...
ASEG

; $=w
2000h
; nchide segmentul relocabil de date i deschide un segment absolut
; $=2000h

...
; $=t
DSEG
; $=w
...

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

ORG
...

; $=x < 0100h


100h; foreaz ncrcarea numrtorului de locaii cu 0000h+100h==100h
; $=0100h

ASEG
...

8000h; nchide segmentul curent i deschide un segment absolut la 8000h


; $=8000h

ORG
...

; $=x < 8040h


40h ; foreaz ncrcarea numrtorului de locaii cu 8000h+40h=8040h
; $=8040h

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

; constante permanente
; constant temporar
; orice apariie a simbolului sens va fi nlocuit cu 1

napoi
; orice apariie a simbolului sens va fi nlocuit cu 0

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

equ 0

intrare1

equ baza+4

intrare2

equ baza OR 10000000b

intrare3

equ (baza+intrare1)*2

TRUE

EQU 1

FALSE

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, ...

; nceputul macroinstruciunii.

...

; Corpul macroinstruciunii.

ENDM

; 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

; Definirea macroinstruciunii ADUNA, cu 2 parametri formali.

LDA par1
MOV B,A
LDA par2
ADD B

; 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.

ENDM

; Sfritul macroinstructiunii ADUNA.

...
ADUNA

a1,a2

STA a3
ADUNA
STA b3

; Calculeaz (a1)+(a2) printr-o referire a macroinstruciunii ADUNA.


; Depune rezultatul n memorie, la adresa a3.

b2,b1

; 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

; 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.

STA a3

; Depune rezultatul n memorie, la adresa a3.

LDA b1
MOV B,A
LDA b2
ADD B

; 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.

STA b3

; 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

memcpy

;
;
;
;
;
;
;
;

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

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
;
...

;
;
;
;

Starea registrelor dinainte de apelul subrutinei.


Se apeleaz subrutina.
Starea registrelor de dup revenirea din subrutin este
aceeai cu cea de dinaintea apelului subrutinei.

; SUBRUTINA ;
Intrare: . . .
;
Ieire: . . .
;
Distruge: Nimic
subrutina:
PUSH
PUSH
PUSH
PUSH

PSW
B
D
H

...
POP
POP
POP
POP
RET

;
;
;
;

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).

; corpul subrutinei - modific registrele i indicatorii de condiie.


H
D
B
PSW

;
;
;
;

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.

S-ar putea să vă placă și