CATEGORII DOCUMENTE |
1 Elemente ale limbajului de asamblare
Programul sursa este format dintr-un numar de linii, care pot fi:
O linie de instructiune a programului sursa are urmatoarea structura:
_Mnemonic__Operand1{,_Operand2}_
unde:
Toate programele care urmeaza a fi asamblate cu macroasamblorul TASM vor avea o parte de preambul minimala, de forma:
.model small
.stack 100h
.code
start:
----- ----- ----
Primele trei liniii sunt directive de asamblare, care declara cantitatea de memorie folosita, pozitia stivei, si inceputul segmentului de cod. A patra linie este eticheta de intrare in program acesta incheindu-se cu declaratia END eticheta_de_intrare.
Finalizarea se poate face cu o linie de bucla infinita si cu directiva end, de forma:
Bucla: jmp bucla
End start
Varianta normala de finalizare foloseste intreruperea 21h si se va prezenta ulterior.
2 Notatia hexazecimala:
In continuare se vor folosi urmatoarele notatii pentru date (valori imediate, precizate in instructiune):
-de 8 biti - n:0..0FFh; notatie echivalenta: imm8;
-de 16 biti - nn:0..0FFFFh;notatie echivalenta: imm16;
-de 32 biti - nnnn:0..0FFFFFFFFh;notatie echivalenta: imm32;
Pentru reprezentarea comoda a datelor, cuvintele in cod binar se impart in mai multe grupuri de cate 4 biti si se asociaza fiecarui astfel de grup un simbol (cele 10 cifre din sistemul zecimal plus primele 6 litere ale alfabetului), rezultand asa-numita reprezentare hexazecimala. Cu 4 biti se pot realiza 24=16 combinatii, conform tabelului 1.
De exemplu, numarul binar:
1001010011001010
se va scrie:
1001.0100.1100.1010
adica 94CA in hexazecimal. Pentru a se evidentia octetii, se mai foloseste si scrierea echivalenta 94.CA, unde 94 este octetul mai semnificativ iar CA octetul mai putin semnificativ.
In felul acesta se folosesc de pana la 4 ori mai putine cifre pentru reprezentarea datelor. Un numar binar de 8 biti (octet) se poate scrie cu 2 cifre hexazecimale, un numar de 16 biti (word) cu 4 cifre hexazecimale, etc.
Pentru a preciza ca un numar este reprezentat in hexazecimal (exista astfel de numere care nu contin deloc litere) se foloseste sufixul h atasat in dreapta. De exemplu numarul anterior se va scrie ca 94CAh.
Majoritatea asmbloarelor nu fac diferente intre litere mari si litere mici, deci se pot folosi si notatii de genul: 94CAh , 94cAH sau 94caH.
Zecimal |
Binar |
Hexazecimal |
|
||
A |
||
B |
||
C |
||
D |
||
E |
||
F |
Tabelul 1 - Reprezentarea hexazecimala
Mediul de asamblare considera implicit constantele ca fiind zecimale. Constantele hexazecimale trebuie sa fie urmate de sufixul H, iar cele binare de sufixul B (se pot folosi litere mari sau litere mici).
Daca se intentioneaza ca toate numerele din program sa fie implicit hexazecimale se poate introduce directiva .Radix 16, de regula inaintea directivei .Stack. Toate numerele folosite folosite in continuare sunt implicit hexazecimale. Pentru specificarea numerelor zecimale se va folosi sufixul D.
Deoarece numerele hexazecimale cuprind si litere, ele ar putea fi confundate cu alte simboluri literale (etichete) folosite in program. De exemplu, numarul hexazecimal ADCEH (in binar 1010.1101.1100.1110) ar putea fi o eticheta, o variabila sau o constanta. Pentru a preciza ca este vorba de un numar, daca numarul incepe cu o litera se pune in stanga sa cifra 0. De exemplu, numarul anterior se va scrie 0ADCEh, numarul 1011.1000.1001.0001 se va scrie 0B891h, etc.
Daca numarul de biti ai cuvantului binar nu este un multiplu de 4, el se va completa in stanga cu 0 pana devine multiplu de 4 si apoi se face delimitarea cifrelor hexazecimale. De exemplu numarul binar:
1011011001 se va scrie 0010.1101.1001= 2D9h sau 02D9h
Numerele folosite de diversi algoritmi pot fi cu semn sau fara semn. Anumite instructiuni aritmetice se comporta diferit pentru cele doua categorii de numere, asa cum se va arata mai tarziu. Pentru numerele cu semn se foloseste urmatoarea conventie: primul bit din stanga al numarului (cel mai semnificativ) este bitul de semn. El are valoarea 0 daca numarul este pozitiv si 1 daca este negativ.
3 Registrele procesoarelor Intel x86
Microprocesorul conventional din seria Intel x86 are urmatoarele registre pentru lucrul curent:
Registrul de 16 biti |
Registrele de 8 biti |
Utilizare preferentiala |
AX AH AL Dedicat inmultirilor si impartirilor, etc.
BX BH BL Adresare (baza segmentului de date)
CX CH CL Contorizare
DX DH DL Utilizat in inmultiri si impartiri
DS Adresa segmentului de date
CS Adresa segmentului de cod
SS Adresa segmentului de stiva
ES Adresa extrasegment (transfer de siruri)
SI Adresa sursei in transferuri de siruri
DI Adresa destinatiei in transferuri de siruri
BP Adresare (baza segmentului de stiva)
SP Indicator de stiva
IP Numarator de program
F Registrul de flaguri (indicatori de conditii)
Registrele au fiecare cate 16 biti, cele generale putand fi impartite in cate doua registre de 8 biti: cel care retine octetul inferior, notat cu sufixul L si cel care retine octetul superior, notat cu sufixul H.
Microprocesoarele de diverse tipuri au mai multe registre, cu mai mult de 16 biti (cele din seriile I-386, I-486 si Pentium ). Registrele de mai sus au de fapt la aceste procesoare un numar de 32 de biti, dar pot fi folosite ca registre de 16 biti cu notatiile de mai sus. In cazul in care se doreste folosirea lor ca registre de 32 de biti, denumirea lor va fi precedata de litera E (de la 'extended'), iar in preambulul programului va trebui pusa directiva .386, pentru a preciza ca este folosit un procesor de la I-386 in sus.
Notatiile folosite pentru registre in cele ce urmeaza sunt:
-de 8 biti - r8: AL,AH,BL,BH,CL,CH,DL,DH;
-de 16 biti - r16: AX,BX,CX,DX,SI,DI,BP,IP,F;
-de 32 biti - r32: EAX,EBX,ECX,EDX,ESI,EDI,EBP,EIP,EF;
-registre de segment -rs: DS,ES,SS,CS.La procesoare de la I-386 in sus mai exista doua registre suplimentare de segment, FS si GS.
4. Instructiuni de transfer intre registre
Mnemonic general: MOV dest,src
dst ← src
Operanzi: dst: r8,r16,r32,rs
src:r8,r16,r32,rs,n,nn,nnnn
Restrictii: nu sunt posibile transferuri de tip:
-MOV rs,rs (nu sunt posibile transferuri intre registre de segment)
-MOV rs,nn (nu se poate scrie o constanta direct intr-un registru de segment)
-MOV cs,* (nu se poate transfera nimic in registrul de segment de cod)
Exemplul 1:
MOV AX, 33H ;Incarca in AX constanta hexa 0033H
MOV DX, 1122H ;Incarca in DX constanta hexa 1122H
MOV CL, AL ;Incarca in CL continutul lui AL
MOV BL, DH ;Incarca in BL continutul lui DH
MOV AH, DL ;Incarca in AH continutul lui DL
Mod de lucru :
Toate constantele numerice specificate mai jos sunt hexazecimale, deci in programul sursa vor fi urmate de sufixul h.
Rularea programelor se va face cu TD in modul pas cu pas (cu tasta F7) si dupa fiecare instructiune se va urmari in fereastra de afisare a registrelor modificarea continutului acestora.
Se vor scrie si testa urmatoarele programe:
P 1. Program de scriere in registrele AL, BL, CL si DL a constantelor 99,AA, BB, respectiv CC.
P Se va completa programul anterior pentru a transfera continutul registrului AL in registrele BL, BH, CL, si DH.
P 3. Program de scriere in registrele AX, BX, CX si DX a constantelor 1122, 3344, 5566, respectiv 7788.
P 4. Se va completa programul anterior pentru a transfera continutul registrului registrului BX in registrul DX, si al registrului CX in AX.
P 5. Program care sa transfere constanta 1234 in registrul DS si constanta 5678 in registrul DX.
P 6. Sa se scrie in registrele AL si BL, constantele 99 si AA si se va face apoi interschimbarea continutului acestora.
5. Instructiuni de interschimbare intre registre
Mnemonic general:
XCHG dst,src
Actiune: Se interschimba continuturile registrelor dest si src.
dst ← src
src ← dst
Operanzi: dst,src:r8,r16,r32
Restrictii:Nu exista instructiuni de tip:
-XCHG rs,rs
-XCHG cs,*
Mod de lucru :
P 7. Se vor incarca urmatoarele registre astfel:
AL cu 11
BL cu 22
CX cu 3344
DX cu 5566
dupa care se va interschimba continutul celor de 8 biti si continutul celor de 16 biti.
P 8. Se vor incarca registrele AL, AH, BL si BH constantele AA,BB,CC si DD si apoi se va efectua permutarea circulara a continutului celor 4 registre. Se vor folosi instructiuni de tip XCHG, si dupa terminarea rularii programului registrele vor trebui sa aiba valorile: AL=BBh, AH=CCh, BL=DDh si BH=AAh
6. Instructiuni de adunare si scadere
Mnemonice generale:
-ADD dst,src - Adunare : dst=dst+src;
-ADC dst,src - Adunare cu transport (CF): dst=dst+src+CF
-SUB dst,src - Scadere: dst=dst - src;
-SBB dst,src - Scadere cu transport ("carry) sau imprumut ("borrow"): dst=dst-src-CF;
In toate operatiile aritmetice, se foloseste implicit conventia complementului fata de Astfel, numerele pozitive au bitul cel mai semnificativ (MSB) 0, iar cele negative au MSB 1. Numerele negative vor avea valoarea diferentei intre valoarea lor absoluta si 28n , unde n este numarul de octeti folositi.
Exemple:
Se observa ca un eventual 0 in fata numarului scris in format hexazecimal nu inseamna ca acesta are semn pozitiv. Conteaza numai primul bit al octetului cel mai semnificativ.
Aceste transformari se pot face cu utilitarul Calculator din Windows, avand optiunea View - > Scientific.
Mod de lucru:
P 9. Se vor incarca registrele cu constantele: AX=1122, BX=3344, CX=5566, DX=7788
si se va efectua urmatoarea succesiune de operatii:
AL+66
AL+BL
AL-CL
AL-22
AL+BL+CL+DL
P 10. Se vor incarca registrele cu constantele: AX=1122, BX=3344, CX=5566, DX=7788
si se va efectua urmatoarea succesiune de operatii:
AX+6666
AX+BX
AX-CX
AX-22
AX+BX+CX+DX
P 11 Se vor incarca doua numere de 32 de biti in registre in felul urmator:
- primul numar 11223344 in AX (octetii superiori) si BX (octetii inferiori)
- al doilea numar 55667788 in CX (octetii superiori) si DX (octetii inferiori) In continuare se va efectua adunarea celor doua numere. Rezultatul trebuie sa fie 6688AACC
P 12 Acelasi program ca la 11, numerele fiind 55667788 si 99AABBCC. Rezulatul trebuie sa fie EF113354.
P 13 Acelasi program ca la 11 dar, numerele fiind 55667788 si 11223344, se va efectua scaderea lor. Rezultatul trebuie sa fie 44444444.
P 14 Acelasi program ca la 13, numerele fiind 22334455 si 66778899. Rezultatul trebuie sa fie BBBBBBBC.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1697
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved