Sunteți pe pagina 1din 24

Curs 9

Programarea microcontrolerelor MCS 51 i compatibile n limbaj de asamblare


Toi membrii familiei MCS-51 execut acelai set de instruciuni, care este optimizat pentru aplicaii de control: varietate de moduri rapide de adresare pentru accesarea memoriei RAM interne; operaii la nivel de octet asupra unor structuri de date de mici dimensiuni; un grup extins de instruciuni pentru operarea cu variabile de un bit, ca un tip distinct de date, ceea ce asigur manipularea direct a variabilelor booleene. 9.1. Formatul instruciunilor 49 de instruciuni de 1 octet; 46 de instruciuni de 2 octei; 16 instruciuni de 3 octei. Primul octet - este ntotdeauna codul operaie (opcodul); Urmtorii octei, dac exist, sunt operanzi sau adrese de operanzi de 1 sau 2 octei. Observaie: Operanzii cu lungimea de 2 octei sunt amplasai n memorie imediat dup codul operaiei, mai nti octetul mai semnificativ i apoi cel mai puin semnificativ, adic tocmai invers dect la microprocesoarele Intel de uz general (de ex. 8085).

9.2. Modurile de adresare - variate i eficiente, n special pentru operanzii stocai n memoria intern de date. Adresarea direct operandul este specificat n instruciune 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 - instruciunea precizeaz registrul care conine adresa operandului. Prin adresare indirect pot fi specificai operanzi att din RAM-ul intern, ct i din cel extern. Pentru adrese de RAM intern (de 8 bii) se pot utiliza registrele R0 sau R1 ale bancului de registre curent sau registrul indicator al vrfului stivei, SP. Pentru adrese de RAM extern (de 16 bii) poate fi utilizat numai registrul DPTR. n sintaxa instruciunii, numele acestor registre trebuie precedate de caracterul @. MOV @R0, A ; octetul din A este stocat n memoria intern de date, la adresa din R0

Adresarea cu registru (explicit) - utilizeaz unul din registrele R0R7 ale bancului curent selectat n PSW. Specificarea registrului care conine operandul se realizeaz, ca i la microprocesoarele de uz general, printr-un cmp de 3 bii rezervat n opcodul instruciunii. MOV A,R7 ; n A se ncarc octetul din registrul R7 (din bancul curent de registre)

Adresarea implicit (cu registru specific) - nu se specific explicit registrul care conine operandul. - folosete registrele speciale, n acest caz A, B, DPTR, sau fanionul de transport, C. Instruciunile care folosesc acest mod de adresare codific registrul sau fanionul folosit implicit n opcodul instruciunii. MUL AB ; nmulete valoarea octetului din A cu ce a octetului din B; rezultatul n BA

Adresarea imediat - operandul se afl cuprins n instruciune, imediat dup opcod. n instruciunile 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 conin adresa de baz, iar deplasamentul locaiei adresate se afl implicit n acumulator, ceea ce permite codificarea instruciunilor cu adresare indexat pe un singur octet. Se folosete la adresarea operanzilor stocai n memoria program, facilitnd procedura de acces la tabelelor organizate n aceast memorie (look-up tables), precum i la o instruciune 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 coninutul registrului PC pentru a calcula adresa la care va avea loc saltul. Se utilizeaz n instruciunile de ramificare, deplasamentul fiind indicat simbolic prin rel. JNZ rel ; salt relativ la adresa instruciunii curente, dac valoarea din A e diferit de 0

9.3. Setul de instruciuni n tabelul care urmeaz este prezentat setul de instruciuni al familiei MCS-51, mprit n 5 clase funcionale: instruciuni aritmetice; instruciuni logice; instruciuni de transfer; instruciuni pentru manipularea variabilelor booleene; instruciuni de ramificare. n afar de mnemonic i o scurt descriere, tabelul conine i formatul instruciunilor. Notaii utilizate: Rn - unul din registrele R0R7 ale bancului de registre selectat RAM intern (0127) sau din zona SFR (128255). @Ri - locaia de 8 bii a memoriei RAM interne (0255), adresat indirect prin registrele R0 sau R1 ale bancului de registre curent. #data - constant de 8 bii inclus n instruciune #data16 - constant de 16 bii inclus n instruciune addr16 - adres de 16 bii din spaiul de memorie program addr11 - adres de 11 bii dintr-o pagin de 2Ko de memorie program rel bit - deplasament de 8 bii, cu semn (-128127) - adresa unui bit dintr-o locaie din zona RAM intern sau SFR, adresabil pe bit. direct - adresa de 8 bii a unei locaii interne de date. Poate fi o locaie din memoria

Nr. crt. 1 2 3 4 5 6 7 8 9

Mnemonica ADD A,Rn ADD A,direct ADD A,@Ri ADD A,#data ADDC A,Rn ADDC A,direct ADDC A,@Ri ADDC A,#data SUBB A,Rn

Descrierea instruciunii Instruciuni aritmetice (A) (A) + (Rn), Add register to n = 07 accumulator Add direct byte to accumulator Add indirect RAM to accumulator Add immediate data to accumulator Add register to A with carry flag Add direct byte to A with carry flag Add indirect RAM to A with carry flag Add immediate data to A with carry flag (A) (A) + (direct) (A) (A) + ((Ri)), i = 0,1 (A) (A) + data (A)(A)+(C)+(Rn), n = 07 (A) (A) + (C) + +(direct) (A) (A) + (C) +((Ri)) i = 0,1 (A) (A) + (C) + data

Formatul Nr. instruciunii cicl.


0 0 1 0 1 r r r n 0 0 1 0 0 1 0 1 direct address 0 0 1 0 0 1 1 i 0 0 1 0 0 1 0 0 data 0 0 1 1 1 r r r n 0 0 1 1 0 1 0 1 direct address 0 0 1 1 0 1 1 i 0 0 1 1 0 1 0 0 data 1 0 0 1 1 r r r n 1 0 0 1 0 1 0 1 direct address

1 1 1 1 1 1 1 1 1 1

Substract register from A (A) (A) - (C) (Rn), n = 07 with borrow Subtract direct byte from (A) (A) - (C) - (direct) A with borrow

10 SUBB A,direct

Nr. Mnemonica crt. 11 SUBB A,@Ri 12 SUBB A,#data 13 INC A 14 INC Rn 15 INC direct 16 INC @Ri 17 DEC A 18 DEC Rn 19 DEC direct 20 DEC @Ri 21 INC DPTR 22 MUL AB 23 DIV AB

Descrierea instruciunii Subtract indirect RAM from A with borrow Subtract immediate data from A with borrow Increment accumulator Increment register Increment direct byte Increment indirect RAM Decrement accumulator Decrement register Decrement direct byte Decrement indirect RAM Increment Data Pointer Multiply A and B Divide A by B (A) (A) - (C) - ((Ri)), i = 0,1 (A)(A)-(C) - data (A) (A) + 1 (Rn) (Rn) + 1, n = 07 (direct)(direct)+1 ((Ri)) ((Ri)) - 1, i = 0,1 (A) (A) - 1 (Rn) (Rn) - 1, n = 07 (direct)(direct)-1 ((Ri)) ((Ri)) - 1, i = 0,1 (DPTR)(DPTR)+1 (B)(A) (A)(B) (A)(B) (A)/(B)

Formatul Nr. instruciunii cicl. 1 1 0 0 1 0 1 1 i


1 0 0 1 0 1 0 0 data 0 0 0 0 0 1 0 0 0 0 0 0 1 r r r n 0 0 0 0 0 1 0 1 direct address 0 0 0 0 0 1 1 i 0 0 0 1 0 1 0 0 0 0 0 1 1 r r r n 0 0 0 1 0 1 0 1 direct address 0 0 0 1 0 1 1 i 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1

1 1 1 1 1 1 1 1 1 2 4 4

Nr. Mnemonica crt. 24 DA A

Descrierea instruciunii Decimal adjust A Dac { [(A30)> 9] [(AC)=1] }, atunci (A30)(A30)+6. Dac { [(A74)>9] [(C)=1] }, atunci (A74) ( A74) +6.

Formatul Nr. instruciunii cicl. 1 1 1 0 1 0 1 0 0

25 ANL A,Rn 26 ANL A,direct 27 ANL A,@Ri 28 ANL A,#data 29 ANL direct,A

Instruciuni logice (A) (A) (Rn), AND register to A n = 07 AND direct byte to A AND indirect RAM to A AND immediate data to A AND A to direct byte (A) (A) (direct) (A) (A) (Ri), i = 0,1 (A) (A) data (direct) (direct) A (direct)(direct) data

0 1 0 1 1 r r r n 0 1 0 1 0 1 0 1 direct address 0 1 0 1 0 1 1 i 0 1 0 1 0 1 0 0 data 0 1 0 1 0 0 1 0 direct address

1 1 1 1 1 2

30 ANL direct,#data AND immediate data to direct byte

0 1 0 1 0 0 1 1 direct address data

31 ORL A,Rn

OR register to A

(A) (A) (Rn), n = 07

0 1 0 0 1 r r r n

Nr. Mnemonica crt. 32 ORL A,direct 33 ORL A,@Ri 34 ORL A,#data 35 ORL direct,A

Descrierea instruciunii OR direct byte to A OR indirect RAM to A OR immediate data to A OR A to direct byte (A) (A) (direct) (A) (A) (Ri), i = 0,1 (A) (A) data (direct) (direct) A (direct)(direct) data

Formatul Nr. instruciunii cicl. 1 0 1 0 0 0 1 0 1


direct address 0 1 0 0 0 1 1 i 0 1 0 0 0 1 0 0 data 0 1 0 0 0 0 1 0 direct address

1 1 1 2

36 ORL direct,#data OR immediate data to direct byte

0 1 0 0 0 0 1 1 direct address data

37 XRL A,Rn 38 XRL A,direct 39 XRL A,@Ri 40 XRL A,#data 41 XRL direct,A

Exclusive OR register to A (A) (A) (Rn), n = 07 Exclusive OR direct byte to A (A) (A) (direct)

0 1 1 0 1 r r r n 0 1 1 0 0 1 0 1 direct address 0 1 1 0 0 1 1 i 0 1 1 0 0 1 0 0 data 0 1 1 0 0 0 1 0 direct address

1 1 1 1 1

Exclusive OR indirect RAM (A) (A) (Ri), i = 0,1 to A (A) (A) data Exclusive OR immediate data to A Exclusive OR A to direct byte (direct) (direct) A

Nr. Mnemonica Descrierea instruciunii crt. (direct)(direct) data 42 XRL direct,#data Exclusive OR immediate data to direct byte

Formatul Nr. instruciunii cicl. 2 0 1 1 0 0 0 1 1


direct address data

43 CLR A 44 CPL A 45 RL A 46 RLC A 47 RR A 48 RRC A 49 SWAP A 50 MOV A,Rn 51 MOV A,direct * 52 MOV A,@Ri 53 MOV A,#data

Clear accumulator Rotate A left Rotate A left through carry flag Rotate A right Rotate A right through carry flag Swap nibble within A

(A) 0 (An+1) (An), n = 06, (A0) (A7) (An+1) (An), n = 06, (A0) (C), (C) (A7) (An) (An+1), n = 06, (A7) (A0) (An) (An+1), n = 06, (A7) (C), (C) (A0) (A30) (A74)

1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0

1 1 1 1 1 1 1 1 1 1 1

Complement accumulator (A) (A)

Instruciuni de transfer (A) (Rn), n = 07 Move register to A Move direct byte to A Move indirect RAM to A (A) (direct) * Instruciunea MOV A,ACC nu exist (A) ((Ri)), i = 0,1

1 1 1 0 1 r r r n 1 1 1 0 0 1 0 1 direct address 1 1 1 0 0 1 1 i 0 1 1 1 0 1 0 0 data

Move immediate data to A (A) data

Nr. Mnemonica crt. 54 MOV Rn,A 55 MOV Rn,direct 56 MOV Rn,#data 57 MOV direct ,A 58 MOV direct,Rn

Descrierea instruciunii Move A to register Move direct byte to register Move immediate data to register Move A to direct byte Move register to direct byte (Rn) (A), n = 07 (Rn) (direct), n = 07 (Rn) data, n = 07 (direct) (A) (direct) (Rn), n = 07

Formatul Nr. instruciunii cicl. 1 1 1 1 1 1 r r r


n 1 0 1 0 1 r r r direct address 0 1 1 1 1 r r r data 1 1 1 1 0 1 0 1 direct address 1 0 0 0 1 r r r direct address 1 0 0 0 0 1 0 1 direct addr. (src.) direct addr. (dest.)

2 1 1 2 2

59 MOV direct,direct Move direct byte to direct (direct) (direct) byte

60 MOV direct,@Ri

Move indirect RAM to direct byte

(direct) ((Ri)), i = 0,1 (direct) data

1 0 0 0 0 1 1 i direct address 0 1 1 1 0 1 0 1 direct address data

2 2

61 MOV direct,#data Move immediate data to direct byte

62 MOV @Ri,A

Move A to indirect RAM

((Ri)) (A), i = 0,1

1 1 1 1 0 1 1 i

Nr. Mnemonica crt. 63 MOV @Ri,direct 64 MOV @Ri,#data 65 MOV DPTR,#data16

Descrierea instruciunii Move direct byte to indirect RAM Move immediate data to indirect RAM Load Data Pointer with a 16-bit constant ((Ri)) (direct), i = 0,1 ((Ri)) data, i =0,1 (DPTR) data16

Formatul Nr. instruciunii cicl. 2 1 0 1 0 0 1 1 i


direct address 0 1 1 1 0 1 1 i data 1 0 0 1 0 0 0 0 HIGH (addr16) LOW (addr16)

1 2

66 MOVC A,@A+DPTR 67 MOVC A,@A+PC 68 MOVX A,@Ri 69 MOVX A,@DPTR 70 MOVX @Ri,A 71 MOVX @DPTR,A 72 PUSH direct 73 POP direct

Move code byte relative to DPTR to A Move code byte relative to PC to A Move external RAM (8-bit address) to A Move external RAM (16bit address) to A Move A to external RAM (8-bit address) Move A to external RAM (16-bit addr.) Push direct byte onto stack Pop direct byte from stack

(A) ((A)+(DPTR)) (PC) (PC)+1 (A) ((A) + (PC)) (A) ((Ri)), i = 0,1 (A) ((DPTR) ((Ri)) (A), i = 0,1 ((DPTR) (A) (SP) (SP) + 1 ((SP)) (direct) (direct) ((SP)) (SP) (SP) - 1

1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 i

2 2 2 2 2 2 2 2

1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 i 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 direct address 1 1 0 1 0 0 0 0 direct address

Nr. Mnemonica crt. 74 XCH A,Rn 75 XCH A,direct 76 XCH A,@Ri

Descrierea instruciunii Exchange register with A (A) (Rn), n = 07

Formatul Nr. instruciunii cicl. 1 1 1 0 0 1 r r r


n 1 1 0 0 0 1 0 1 direct address 1 1 0 0 0 1 1 i 1 1 0 1 0 1 1 i

Exchange direct byte with (A) (direct) A

1 1 1

(A) ((Ri)), i = 0,1 Exchange indirect RAM with A 77 XCHD A,@Ri Exchange low-order Digit (A30) ((Ri30)), i = 0,1 indirect RAM with A Instruciuni pentru manipularea variabilelor booleene (C) 0 78 CLR C Clear carry flag 79 CLR bit 80 CPL C 81 CPL bit 82 SETB C 83 SETB bit 84 ANL C,bit Clear direct bit Complement carry Complement direct bit Set carry flag Set direct bit AND direct bit to carry flag (bit) 0 (C) (C) (bit) (bit) (C) 1 (bit) 1 (C) (C) (bit)

1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 bit address 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 bit address 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 0 bit address 1 0 0 0 0 0 1 0 bit address

1 1 1 1 1 1 2

Nr. Mnemonica crt. 85 ANL C, /bit 86 ORL C,bit 87 ORL C, /bit 88 MOV C,bit 89 MOV bit,C

Descrierea instruciunii AND complement of direct (C) (C) (bit) bit to carry OR direct bit to carry flag OR complement of direct bit to carry Move direct bit to carry flag Move carry flag to direct bit (C) (C) (bit) (C) (C) (bit) (C) (bit) (bit) (C)

Formatul Nr. instruciunii cicl. 2 1 0 1 1 0 0 0 0


bit address 0 1 1 1 0 0 1 0 bit address 1 0 1 0 0 0 0 0 bit address 1 0 1 0 0 0 1 0 bit address 1 0 0 1 0 0 1 0 bit address

2 2 1 2

90 ACALL addr11

91 LCALL addr16

Instruciuni de ramificare (PC) (PC) +2 Absolute subroutine call (SP) (SP) +1 ((SP)) (PC70) (SP) (SP) +1 ((SP)) (PC158) (PC100) addr11 (PC) (PC) +3 Long subroutine call (SP) (SP) +1 ((SP)) (PC70) (SP) (SP) +1 ((SP)) (PC15-8) (PC) addr16

a10 a9 a81 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0

0 0 0 1 0 0 1 0 HIGH (addr16) LOW (addr16)

Nr. Mnemonica crt. 92 RET

Descrierea instruciunii Return from subroutine (PC158) ((SP)) (SP) (SP) -1 (PC70) ((SP)) (SP) (SP) -1 (PC158) (SP) (SP) (SP) -1 (PC70) ((SP)) (SP) (SP) -1 (PC) (PC) +2 (PC100) addr11 (PC) addr16

Formatul Nr. instruciunii cicl. 2 0 0 1 0 0 0 1 0

93 RETI

Return from interrupt

0 0 1 1 0 0 1 0

94 AJMP addr11 95 LJMP addr16

Absolute jump address Long jump

a10 a9 a80 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 1 0 HIGH (addr16) LOW (addr16)

2 2

96 SJMP rel 97 JMP @A+DPTR 98 JZ rel 99 JNZ rel

Short jump (relative address) Jump indirect relative to the DPTR Jump if A is zero Jump if A is not zero

(PC) (PC) +2 (PC) (PC) +rel (PC) (A) +(DPTR) (PC) (PC) +2 Dac (A) = 0, atunci (PC) (PC) +rel (PC) (PC) +2 Dac (A) 0, atunci (PC) (PC) +rel

1 0 0 0 0 0 0 0 rel. address 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 rel. address 0 1 1 1 0 0 0 0 rel. address

2 2 2 2

Nr. Mnemonica crt. 100 JC rel 101 JNC rel 102 JB bit,rel

Descrierea instruciunii Jump if carry flag is set Jump if carry flag is not set Jump if direct bit is set (PC) (PC) +2 Dac (C) = 1, atunci (PC) (PC) +rel (PC) (PC) +2 Dac (C) = 1, atunci (PC) (PC) +rel (PC) (PC) +3 Dac (bit) = 1, atunci (PC) (PC) +rel (PC) (PC) +3 Dac (bit) = 0, atunci (PC) (PC) +rel (PC) (PC) +3 Dac (bit) = 1, atunci (bit) 0 i (PC) (PC) + rel (PC) (PC) +3 Dac (A) (direct), atunci (PC) (PC) + rel Dac (A) < (direct), atunci (C) 1, altfel (C) 0.

Formatul Nr. instruciunii cicl. 2 0 1 0 0 0 0 0 0


rel. address 0 1 0 1 0 0 0 0 rel. address 0 0 1 0 0 0 0 0 bit address rel. address

2 2

103 JNB bit,rel

Jump if direct bit is not set

0 0 1 1 0 0 0 0 bit address rel. address

104 JBC bit,rel

Jump if direct bit is set and clear bit

0 0 0 1 0 0 0 0 bit address rel. address 1 0 1 1 0 1 0 1 direct address rel. address

105 CJNE A,direct,rel Compare direct byte to A and jump if not equal

Nr. Mnemonica Descrierea instruciunii crt. 106 CJNE A,#data,rel Compare immediate byte (PC) (PC) +3 to A and jump if not equal Dac (A) data, atunci (PC) (PC) + rel. Dac (A) < data, atunci (C) 1, altfel (C) 0. 107 CJNE Compare immediate byte (PC) (PC) +3 Rn,#data,rel to register and jump if Dac (Rn) data, atunci not equal (PC) (PC) + rel. Dac (Rn) <data, atunci (C) 1, altfel (C) 0. 108 CJNE Compare immediate byte (PC) (PC) +3 @Ri,#data,rel to indirect and jump if not Dac (Ri))data, atunci equal (PC) (PC) + rel Dac ((Ri))<data, atunci (C) 1, altfel (C) 0. (PC) (PC) +2 109 DJNZ Rn,rel Decrement register and jump if not zero (Rn) (Rn)-1, n = 07. Dac (Rn) 0, atunci (PC) (PC) + rel (PC) (PC) +2 110 DJNZ direct,rel Decrement direct byte and jump if not zero (direct) (direct)-1 Dac (direct)0, atunci (PC) (PC) + rel (PC) (PC) + 1 111 NOP No operation

Formatul Nr. instruciunii cicl. 2 1 0 1 1 0 1 0 0


data rel. address

1 0 1 1 1 r r r data rel. address

1 0 1 1 0 1 1 i data rel. address

1 1 0 1 1 r r r rel. address

1 1 0 1 0 1 0 1 direct address rel. address 0 0 0 0 0 0 0 0

Tabelul anterior nu conine nici o referire la indicatorii de condiie afectai. Un numr relativ mic de tipuri de instruciuni afecteaz doar o parte dintre aceti indicatori, aa cum reiese i din tabelul de mai jos. Operaiile directe asupra octetului cu adresa D0h din zona SFR (adic registrul PSW) sau asupra biilor din zona D0hD7h afecteaz fanioanele de condiii corespunztoare, dac se ine seama c fanioanele de condiii pot fi adresate direct pe bit, avnd urmtoarele adrese: OV=D2h, AC=D6h, C=D7h. Instruciune C OV AC

Instruciuni care afecteaz indirect indicatorii de condiie ADD ! ! ! ADC ! ! ! SUBB ! ! ! MUL 0 ! DIV 0 ! RRC ! RLC ! Instruciuni care afecteaz direct indicatorii de condiie SETB C 1 CLR C 0 ANL C, bit ! ANL C, /bit ! ORL C, bit ! ORL C, /bit ! MOV C, bit ! CJNE ! 0 : resetat; 1 : setat; ! : afectat n funcie de rezultat; - : neafectat

9.4. Elemente de programare n limbaj de asamblare Scrierea programelor surs n limbaj de asamblare necesit cunoaterea: - setului de instruciuni; - directivelor de asamblare; - regulilor sintactice de scriere a codului surs. Intel - macro-asamblorul ASM51 - st la baza majoritii asambloarelor comerciale: Keil Software Raisonance (Franklin) IAR Systems Archimedes Software Avocet Systems BSO/Tasking .a. Sunt incluse n medii software integrate de dezvoltare a aplicaiilor, mpreun cu compilatoare C, editoare de legturi, simulatoare, depanatoare i alte programe utilitare. Versiuni demonstrative pot fi descrcate, instalate i testate gratuit de pe site-urile Internet ale unor firme cum sunt: Keil Software Inc. (http://www.keil.com) Raisonance SA (http://www.raisonance.com) Ultima a preluat Franklin Software i continu dezvoltarea mediului integrat ProView n varianta RIDE (Raisonance Integrated Development Environment). n cele ce urmeaz se prezint principalele directive de asamblare i reguli sintactice de scriere a fiierelor surs, aa 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 bii n memoria RAM intern (BIT). Un astfel de segment poate fi absolut: definit cu una din directivele CSEG, DSEG, XSEG, ISEG, BSEG; avnd adresa de ncrcare stabilit de programator la scrierea programului surs; sau poate fi relocabil: definit cu directiva RSEG; caz n care adresa de ncrcare va fi fixat ulterior, de ctre editorul de legturi. Exemplu: ?RELCOD RSEG

SEGMENT ?RELCOD

CODE

; ?RELCOD este un segment de cod relocabil ; secvena de instruciuni care urmeaz face parte din ; segmentul de cod relocabil ?RELCOD ; foreaz amplasarea secvenei de cod care urmeaz ;la adresa 001Bh (segment de cod absolut)

;.................... CSEG AT 001Bh ;.................... ?RELDATA SEGMENT DATA RSEG ?RELDATA

; urmeaz secvena de pseudoinstruciuni de ; amplasare static a datelor n memoria extern

;....................

Alte directive de asamblare uzuale: ORG exp foreaz amplasarea urmtoarei instruciuni 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. [etich:] DB list (Define Byte) definire i iniializare zon de memorie la nivel de octet. [etich:] DW lista (Define Word) - definire i iniializare zon de memorie la nivel de cuvnt: octetul mai semnificativ se memoreaz la adresa mai mic (invers dect la microprocesoarele de uz general). [etich:] DBIT lista (Define Bit) - definire i iniializare 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 spaiu de memorie neiniializat, 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 fr a fi definite (trebuie definite ntr-un alt modul surs i declarate acolo de tip public). END - indic sfritul fiierului surs, fiind delimitatorul su final. Detectarea sa de ctre asamblor va determina sfritul unei faze (treceri) a asamblrii.

Formatul fiierului surs este similar cu cel discutat la programarea n asamblare la 8085. <INSTR> ::= <ETICHETA> DC<COD>DC<OPERAND>DC<COMENTARIU>, <ETICHETA> ::= <SIMBOL> <SIMBOL> ::= <LITERA>|<LITERA><CARACTER>|<LITERA><SIMBOL> <COD> := MOVX|ADDC|PUSH|....|ORG|...|DBIT <OPERAND> ::= |<ARGUMENT>|<ARGUMENT>,...,<ARGUMENT> <ARGUMENT>::= <CONSTANTA>|<SIMBOL>| <SIMBOL><OP><ARGUMENT>| <CONSTANTA><OP><ARGUMENT> <OP> ::= + | - | * | / Cmpul operand poate specifica: un nume de registru; o adres de SFR; o constant numeric sau simbolic de 1 sau 2 octei; o etichet dintr-un segment de cod sau de date; o expresie aritmetic; Dac sunt doi operanzi: - primul operand specific destinaia operaiei; - al doilea specific sursa; - cei doi operanzi se separ prin virgul.

Operanzii de tip constant pot fi exprimai n urmtoarele moduri: 1. O constant zecimal precedat de caracterul #. Etichet Cod Operand Comentariu et1: MOV A,#58 ; Iniializeaz acumulatorul cu constanta 5810 =316+10=3A16. 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 ; Poziioneaz 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 ; Iniializeaz 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 instruciunii curente, care se specific prin caracterul $. LJMP $+8 ; Salt n program peste 8 locaii de memorie, la adresa curent +8. 6. O constant ASCII inclus ntre ghilimele simple. MOV A,@ ; ncarc n acumulator codul ASCII al caracterului @ (= 40h). 7. Numele unei constante simbolice creia 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 coninutul acumulatorului. JNZ bucla ; Dac, dup decrementare, A0, execut un salt la ; ... ; instruciunea de la adresa bucla. contor: DB 10 ; Rezerv un octet, la adresa contor 9. Numele direct sau PUSH POP PUSH POP SETB MOV unui registru SFR, adresa unei locaii de memorie de RAM interne adresate o adres de bit. ACC ; depune pe stiv coninutul registrului A (vzut ca SFR, cu adresa 0E0h) DPH ; extrage din stiv un octet pe care l ncarc n DPH 00h ; Pune pe stiv coninutul registrului R0 (adresa de RAM intern 00h) 40h ; Extrage din stiv un octet, pe care l ncarc n memoria RAM intern, ; la adresa 40h ACC.0 ; Seteaz bitul cel mai puin semnificativ al registrului acumulator. 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 conectai cu ajutorul operatorilor: - aritmetici: +, -,*, /, MOD (modulo) - logici: NOT, AND, OR, XOR, LOW, HIGH, SHL, SHR (deplasare la stnga sau la dreapta), precum i cu ajutorul parantezelor (stnga i dreapta). Lungimea operanzilor luai n consideraie la evaluarea expresiilor de ctre asamblor este de 16 bii.

Operatorii aritmetici realizeaz adunarea, scderea, nmulirea, mprirea ntreag, respectiv calculul restului mpririi dintre 2 operanzi. Operatorii logici acioneaz la nivel de bit i produc selecia, complementarea, produsul logic, suma logic i respectiv suma modulo 2 a argumentelor. Operatorii SHL i SHR produc deplasarea liniar a primului operand spre stnga, respectiv spre dreapta, cu un numr de poziii egal cu valoarea celui de-al doilea operand. n partea opus deplasrii se introduc un numr de zerouri egal cu numrul de deplasri. Ordinea n care sunt executate operaiile dintr-o expresie este urmtoarea: 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 separai de operanzi cu cel puin un blanc. Comentariul - este un cmp este opional; - este alctuit dintr-un ir de caractere alfanumerice; - utilizat de programator pentru descrierea operaiei executate de respectiva instruciune. - trebuie precedat de un caracter ;, care l separ de cmpul operand. - de regul acesta este precedat, pentru aliniere, de mai multe blancuri sau tabulatori ( , TAB); - se poate ntinde pe mai multe rnduri, dar fiecare rnd trebuie s nceap cu un delimitator ;.

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