Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Instructiuni de transfer intre registre

calculatoare



+ Font mai mare | - Font mai mic



Instructiuni de transfer intre registre

1 Elemente ale limbajului de asamblare

Programul sursa este format dintr-un numar de linii, care pot fi:



  • Directive de asamblare
  • Etichete si declaratii de simboluri
  • Comentarii
  • Linii de instructiuni

O linie de instructiune a programului sursa are urmatoarea structura:

_Mnemonic__Operand1{,_Operand2}_

unde:

  • Parantezele acolade indica un camp optional;
  • Semnul _ indica un separator, care poate fi format din spatii sau tab-uri; Intre Operand1 si Operand2, separatorul este de regula o virgula;
  • Eticheta este un grup de caractere care incepe cu o litera si nu coincide cu un cuvant rezervat. Ea trebuie urmata de semnul ":" atunci cand se afla la inceputul liniei. Cand este referita ca operand (de exemplu la o instructiune de salt), ea nu mai este urmata de acest semn. Exemple: Eticheta1, Loop15, Salt, Label, L22, etc.
  • Mnemonicul este o prescurtare a descrierii instructiunii si este conform cu setul de instructiuni al procesorului;
  • Operandul poate fi un nume de registru, o constanta numerica (date sau adrese), sau o eticheta, conform descrierii instructiunii respective;
  • Prefixele dau precizari suplimentare despre operanzi, conform descrierii instructiunii respective;
  • Comentariul este optional si trebuie precedat de semnul ";" . Tot ceea ce urmeaza pe o linie dupa acest semn este ignorat de asmblor.

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

Actiune: 'dst' ia valoarea 'scr'

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:

  • 25h=0010.0101 este un numar pozitiv, avand echivalentul zecimal 37;
  • 0B3Ch= 0000.1011.0011.1100 este un numar pozitiv, cu echivalent zecimal 2876;
  • 0A7h=1010.0111 este un numar negativ (daca este considerat de un octet), cu valoare absoluta 167 si valoare in complement fata de 2 care se calculeaza conform formulei 167-28 = -89;
  • 0CEACh = 1100.1110.1010.1100  este un numar negativ de doi octeti, cu valoare absoluta 52908 si valoare in complement fata de 2 care se calculeaza conform formulei 52908-216 = -12628;

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1675
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved