programare in limbaj de asamblare lucrarea de laborator nr · operaţii simple cu numere scrise în...

14
Programare in limbaj de asamblare Lucrarea de laborator nr.1 Cuprins 1. Conversii şi operaţii în diferite baze de numeraţie (binara, octala, hexazecimala, zecimala) 2. Familiarizare cu mediul de dezvoltare Z80Simulator si etapele dezvoltarii aplicatiilor 3. Dezvoltarea primelor aplicatii in limbaj de asamblare : i. Instructiuni de transfer pe 8/16 biti. ii.Registrii index IX si IY.

Upload: others

Post on 04-Sep-2019

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Programare in limbaj de asamblareLucrarea de laborator nr.1

Cuprins1. Conversii şi operaţii în diferite baze de numeraţie (binara, octala, hexazecimala, zecimala)2. Familiarizare cu mediul de dezvoltare Z80Simulator si etapele dezvoltarii aplicatiilor3. Dezvoltarea primelor aplicatii in limbaj de asamblare :i. Instructiuni de transfer pe 8/16 biti.

ii.Registrii index IX si IY.

Page 2: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Conversii şi operaţii în diferite baze de numeraţie (binara, octala, hexazecimala, zecimala)

Paragraful se va axa pe conversia numerelor întregi şi zecimale din baza 10 într-o bază oarecare, în special baza 16, 2 şi 8, precum şi pe conversia inversă, dintr-o bază oarecare în baza 10, mai ales din baza 16, 2 şi 8 în baza 10. Se va studia şi modul de realizare a conversiei din baza 16 direct în baza 2 sau 8 şi invers. Vor fi prezentate operaţii simple (adunări, scăderi) în diferite baze de numeraţie.

Consideraţii teoretice

Un sistem de numeraţie este constituit din totalitatea regulilor de reprezentare a numerelor cu ajutorul anumitor simboluri denumite cifre.

Pentru orice sistem de numeraţie , numărul semnelor distincte pentru cifrele sistemului este egal cu baza (b). Deci pentru baza b=2 (numere scrise în binar) semnele vor fi cifrele 0 şi 1. Pentru baza b=16 (hexazecimal) semnele vor fi 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Se observă că pentru numerele scrise într-o bază mai mare decât baza 10 (zecimal) se folosesc şi alte simboluri (litere) pe lângă cifrele obişnuite din baza 10. Astfel, în cazul numerelor scrise în hexazecimal, literele A,B,C,D,E,F au ca şi valori asociate 10,11,12,13,14,15.

Pentru a face uşor distincţie între numerele scrise într-o anumită bază, la sfârşitul numărului se mai scrie o literă ce simbolizează baza, de exemplu:B pentru numerele scrise în binar (baza 2)Q pentru numerele scrise în octal (baza 8)D pentru numerele scrise în zecimal (baza 10) H pentru numerele scrise în hexazecimal (baza 16)

De regulă numerele scrise în baza 10 nu trebuie neapărat să fie urmate de simbolul “D”, pentru că această bază se consideră implicită. Există şi alte moduri de notare, cum ar fi scrierea la sfârşitul numărului în paranteză a bazei, de exemplu: 100101001(2), sau 17A6B(16).

Dacă se dă un număr scris într-o bază oarecare “b” sub forma parte întreagă şi parte zecimală:Nr(b) = Cn Cn-1 Cn-2 … C2C1 C0 , D1D2D2D3… ,

atunci valoarea sa în baza 10 va fi:Nr(10) = Cn * bn + C n-1 * bn-1 + … + C 2 * b2 + C 1 * b1+ C 0 * b0 + D1 * b-1 + D2 * b –2 +

+ D3 * b –3 + …

Conversia numerelor din baza 10 într-o bază oarecare

În primul rând trebuie subliniat că pentru conversia unui număr care conţine atât parte întreagă cât şi parte zecimală trebuie convertite separat partea întreagă şi cea zecimală.

Conversia părţii întregi

Algoritmul cel mai simplu constă în împărţirea succesivă a numărului scris în baza 10 la baza spre care se doreşte conversia (se împarte numărul la bază, iar în

Page 3: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

continuare se împarte câtul obţinut la bază ş.a.m.d. până când câtul devine 0), după care se iau resturile obţinute în ordine inversă, care constituie valoarea numărului în baza cerută.

Exemple:• Să se convertească numerele întregi 347 şi 438 din baza 10 în baza 16, 2 şi 8.

Mai întâi se converteşte în baza 16 pentru că aceasta se realizează prin mai puţine împărţiri decât conversia în baza 2 sau 8.

347 1632 21 16 27 16 1 16 16 5 0 0 11 1

(adică “B”)

Astfel, luând resturile în ordine inversă obţinem 15B(H).

Mai departe, putem realiza conversia în baza 2 şi 8 în mod analog, dar există şi o metodă mai rapidă de conversie a numerelor între bazele 2,8 şi 16 ţinând cont că pentru fiecare cifră hexa există 4 cifre binare corespondente şi pentru fiecare cifră în octal există 3 cifre binare după tabelul care urmează:

Valoarea în zecimal

Valoarea în hexazecimal

Numărul binar coresp. cifrei hexa

Numărul binar coresp. cifrei octal

0 0 0000 0001 1 0001 0012 2 0010 0103 3 0011 0114 4 0100 1005 5 0101 1016 6 0110 1107 7 0111 1118 8 10009 9 100110 A 101011 B 101112 C 110013 D 110114 E 111015 F 1111

Mai trebuie ţinut cont la trecerea unui număr prin bazele 2,8,16 că gruparea cifrelor din baza 2 se face ”dinspre virgulă spre extremităţi”, adică la numerele întregi de la dreapta la stânga (prin completare cu zerouri la stânga numărului dacă este cazul, deci

Page 4: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

în partea care nu-i afectează valoarea), iar la numerele zecimale gruparea se face de după virgulă de la stânga la dreapta, prin adăugare de zerouri la dreapta numărului.

În concluzie,• 347(D) = 15B(H) = 1 0101 1011(B) = 533(O)• 438(D) = 1B6(H) = 1 1011 0110 (B) = 666(O)

Conversia părţii zecimale

Pentru a converti un număr subunitar (deci partea fracţionară a unui număr) din baza 10 într-o bază oarecare se fac înmulţiri succesive ale părţilor fracţionare până când se ajunge la parte fracţionară nulă, sau se ajunge la perioadă sau se depăşeşte capacitatea de reprezentare (se obţin cifre suficiente, deşi algoritmul nu s-ar fi terminat). Ceea ce depăşeşte partea zecimală la fiecare înmulţire reprezintă o cifră a numărului în baza spre care se face conversia.

Pentru exemplificare este uşor să se folosească schema următoare, care prin cele două linii separă mai clar cifrele reprezentării precum şi indică mai bine poziţia virgulei (cifrele de la prima înmulţire în jos adică de sub linie sunt după virgulă). Trebuie remarcat că se înmulţeşte doar ceea ce este în dreapta virgulei.

Exemplu:• Să se convertească numărul 0,47(D) în binar, octal şi hexazecimal:

0, 47*20 941 881 761 521 040 080 160 320 641 280 561 120 240 480 961 ...

Deci 0,47(D) = 0,0111 1000 0101 0001 (B) = 0,7851(H) = 0,3605(O)

Conversia unui număr care are atât parte întreagă cât şi parte zecimală se face convertind pe rând partea întreagă şi cea zecimală.

Page 5: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Exemplu:• Să se reprezinte în baza 2 si 16 numărul real 14,75 Obţinem: 14(D) = 1110(B) = E(H),iar 0,75(D) = 0,11(B) = C(H).Deci 14,75(D) = 1110,11(B) = E,C(H)

Conversia unui număr dintr-o bază oarecare în baza 10

Pentru a converti un număr dintr-o bază oarecare în baza 10 se poate folosi formula definită în prima parte a lucrării şi anume dacă se dă un număr scris într-o bază oarecare “b” sub forma parte întreagă şi parte zecimală:Nr(b) = Cn Cn-1 Cn-2 … C2C1 C0 , D1D2D2D3…

atunci valoarea sa în baza 10 va fi:Nr(10) = Cn * bn + C n-1 * bn-1 + … + C 2 * b2 + C 1 * b1+ C 0 * b0 + D1 * b-1 + D2 * b –2 +

+ D3 * b –3 + …

Exemple:

• Se dă numărul întreg în hexazecimal 3A8(H) şi se cere valoarea sa în zecimal:N = 3*162 + 10*16 1 + 8 = 3*256 + 160 + 8 = 936(D)

• Se dă numărul fracţionar 0,341(Q) scris în baza 8 şi se cere valoarea sa în zecimalN = 3*8 –1 + 4*8 –2 +1*8 –3 = 3/8 +4/64 + 1/512 = 0.4394(D)

• Se dă numărul în binar 110,11(B) şi se cere valoarea sa în hexazecimal şi în zecimal:N = 110,11(B) = 6,C(H) = 6,75(D)

Operaţii simple cu numere scrise în diferite baze

În continuare vor fi prezentate operaţiile de adunare şi scădere a numerelor scrise în binar, octal şi hexazecimal a numerelor întregi fără semn.

Adunarea

Adunarea se face după aceleaşi reguli ca în zecimal, cu observaţia că cifra cea mai mare dintr-o baza “b” va fi b-1 (adică 9 in zecimal, 7 in octal, 1 in binar şi F în hexazecimal). Deci dacă prin adunarea a două cifre de rang “i” se va obţine un rezultat mai mare decât b-1, va apare acel transport spre cifra de rang următor “i”+1, iar pe poziţia de rang “i” va rămâne restul împărţirii rezultatului adunării cifrelor de rang “i” la bază. Transportul spre cifra de rang “i”+1 va deveni o nouă unitate la suma cifrelor de rang “i”+1, adică se va mai aduna acel transport 1.

Page 6: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Exemple: 1111 1 11 11

01010110(B)+ 1364(Q)+ 6D8A32(H)+10110101(B) 3721(Q) 33E4C8(H)

100001011(B) 5305(Q) A16EFA(H)

S-a marcat transportul de o unitate la cifra de rang superior prin scrierea unui 1 deasupra cifrei de rang superior la care s-a făcut transportul. Operaţia de adunare în binar este utilă la reprezentarea numerelor în complement faţă de 2 când se alege varianta adunării valorii 1 la reprezentarea din complement faţă de 1 (vezi lucrarea cu reprezentarea datelor).

Exemple:• Să se adune cele 2 numere întregi 347(D) şi 438(D) convertite mai sus în lucrare în

bazele 16 si 8 si să se verifice rezultatul prin conversia lui in baza 10

347(D)+ 438(D) = 785(D) 15B(H) + 1B6(H) = 311(H). Verificare: 311(H) = 3*256+1*16+1 = 785533(Q) + 666(Q) = 1421(Q). Verificare:1421(Q) = 1*512+4*64+2*8+1 = 785

Scăderea

Si pentru scădere sunt valabile regulile de la scăderea din zecimal şi anume: dacă nu se pot scădea două cifre re rang “i” (adică cifra descăzutului este mai mică decât a scăzătorului) se face “împrumut” o unitate din cifra de rang următor (“i”+1). În cazul în care cifra din care se doreşte realizarea “împrumutului” este 0, se face “împrumutul” mai departe la cifra de rang următor.

Exemple: . . . .

01011010(B) – A3D4(H) –01001100(B) 751B(H)00001110(B) 2EB9(H)

• Să se scadă cele două numere întregi 347(D) şi 438(D) convertite mai sus în lucrare în bazele de numeraţie 16 şi 8 şi să se verifice rezultatul prin conversia lui în zecimal.

438 – 347 = 91(D) 1B6(H) – 15B(H) = 5B(H). Verificare: 5B(H) = 5*16+11 = 91666(Q) – 533(Q) = 133(Q). Verificare 133(Q) = 1*64+3*8+3 = 91

Operaţia de scădere este utilă când se doreşte reprezentarea numerelor în complement faţă de 2 şi se efectuează scăderea din 2nr_biti_reprez + 1 a numărului reprezentat în modul.

Page 7: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Cerinte : Se se realizeze conversiile din exemplele prezentate:

• conversia numerelor din baza 10 in baza 2,8 şi 16• conversia unui număr intre bazele 2,8 şi 16• conversii din bazele 2,8 şi 16 în baza 10• conversia numerelor zecimale din baza 10 în baza 2 şi 16• operaţii de adunare şi scădere numere în bazele 2 şi 16

Familiarizare cu mediul de dezvoltare Z80Simulator si etapele dezvoltarii aplicatiilor

In continuare este prezentat un ghid pas cu pas pentru a pune in evidenta cele mai importante caracteristici ale simulatorului de procesor si instrumentele utilizate in dezvoltare. De retinut ca toate valorile care apar in campurile registrilor simulatorului, in harta de memorie si in mare parte in aplicatiile care se vor dezvolta sunt in reprezentare hexazecimala.

Fereastra de lucru principala a simulatorului este prezentata in figura urmatoare.

Dupa cum se poate observa simulatorul prezinta campuri care sa indice la fiecare pas incarcarea registrilor interni ai procesorului, sintaxa instructiunii curente, adresa si sintaxa instructiunii urmatoare, numarul de cicli de ceas pentru executia unei instructiuni, numarul de instructiuni ale unui program si butoane specializate pentru generarea intreruperilor mascabile / nemascabile.Descriere generala :

- campul registrilor interni principali (Main registers) reda continutul registrilor pe 8biti A, B, C, D, E, H, L. Acesti registri se pot concatena pentru lucrul cu cuvinte de date de 16biti intr-un singur mod (unic, nu sunt permise alte combinatii datorita hardwareului). Astfel registrii B si C formeaza registrul BC in care B va contine cel mai semnificativ octet (Most Significant Byte) si C va contine cel mai putin semnificativ octet (Least Significant Byte). Analog, registrii D si E formeaza registrul DE si registrii H si L formeaza registrul HL. Registrul A se poate concatena in anumite circumstante cu registrul F. Acesti registri desi sunt de uz general sufera cateva restrictii la utilizarea lor in instructiuni. Aceste restrictii vor fi mentionate in prezentarea setului de instructiuni si pe parcurs.

- campul registrilor alternativi (auxiliari) reda continutul registrilor pe 8biti A’, B’, C’, D’, E’, H’, L’. Regulile de concatenare sunt aceleasi ca si la setul principal si exista instructiuni care ofera posibilitatea interschimbarii informatiei continute in setul de registri primar si cel auxiliar.

Page 8: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

- campul registrului F reda bitii setati in registrul indicator de conditie (flag). Aici avem informatie privind :

- semnul ultimei instructiuni executate (SF, Sign Flag), - rezultatul ultimei instructiuni (ZF, ZeroFlag), - YF si XF biti neutilizati, - bit pentru marcare transport auxiliar HF (Half Transport Flag), - bit care marcheaza depasirea capacitatii de reprezentare pentru o data PF (Parity

Overflow Flag) - indicator de adunare si scadere util in ajustarea zecimala (NF)- indicator de transport (Carry Flag).

Campurile registrilor pe 16 biti redau valorile pe 16biti din registri de index (IX si IY), indicatorul de stiva (Stack Pointer, SP) si contorul de program (Program Counter, PC). Registri speciali I (registru pe 8 biţi care conţine cei mai semnificativi 8 biţi ai adresei tabelei cu adresele rutinelor de tratare a întreruperilor) si R (adresa de refresh) vor fi utilizati doar in aplicatii speciale. Bistabilele pentru controlul intreruperilor IFF1 si IFF2 redau activarea / dezactivarea intreruperilor mascabile si IM reda modul de intrerupere care a fost generat (mod 0, 1 sau 2).

Instrumentele aditionale pentru dezvoltarea de aplicatii sunt :- asamblorul – unde se vor scrie sursele programelor (meniu Tools - Assembler) avand aici capacitatea de a asambla programul scris si de a-l incarca in memoria program,- editorul de memorie – care reprezinta harta memorie unificate (RAM + ROM) pentru sistemul considerat (meniu Tool- Memory editor)- simulation log viewer – care reda istoricul executie unui program cu referire la evolutia incarcarii registrilor cu aumite valori de-a lungul executiei ca urmare a instructiunilor programuluiImaginea urmatoare reda ferestrele active de lucru.

Page 9: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Realizarea şi rularea unui program în asamblare presupune parcurgerea următoarelor etape:

• conceperea algoritmului; • scrierea programului în limbajul de asamblare corespunzător procesorului ;

Programul se scrie in editorul asamblorului. Sintaxa nu este case sensitive insa trebuie tinut cont de indentare intrucat o instructiune care nu este scrisa corespunzator este interpretata ca o eticheta si astfel programul va avea o executie defectuoasa.

• translarea fişierului text care conţine programul sursă, în fişiere obiect relocabile utilizând un assembler; • linke-ditarea fişierelor obiect într-un singur fişier obiect executabil, prin reevaluarea atât a legăturilor interne cât şi a legăturilor externe. Aceasta etapă de lucru se realizează cu ajutorul unui program denumit linkeditor;

Dupa asamblarea si linkeditarea programului se obtine fisierul obj care va fi scris in memoria program a sistemului. Outputul asamblarii este redat in partea de jos a editorului asamblorului si putem observa pe prima coloana indicele instructiunii, apoi a doua coloana adresa de memorie de unde incepe acea instructiune si pe a treia, a patra ... se afla codul masina asociat instructiunii respective. Fiecare instructiune a limbajului de asamblare are un cod de operarie (OPCODE) fix in hexazecimal si se poate modifica doar functie de tipul operanzilor sau de numarul opearanzilor. Datorita faptului ca orice instructiune are un cod hexa in limbajul masina (ex : HALT are codul 76) care marcheaza tipul instructiunii si apoi operanzii se poate observa apoi in harta memoriei (dreapta) cum apare programul scris in memoria program. Fiecare instructiune este scrisa succesiv in memorie avand un numar de octeti corespunzator (ex: LD A,0FFH are 2 octeti 3E si FF).

• încărcarea programului în memoria de lucru a microsistemului; Programul asamblat si linkedit se poate incarca in memoria sistemului utilizand comanda Load din meniul simulatorului sau a asamblorului. Dupa aceasta operatiune codul masina va aparea in memorie. Dupa incarcarea programului se poate selecta o rata de executie a

Page 10: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

programului care poate fi pas cu pas (pentru analiza utilizatorului) pana la viteze ultra-rapide aproape de viteza reala a procesorului real.

• rularea programului încărcat în memorie şi evident verificarea rezultatului obţinut. Rularea se realizeaza utilizand comenzile din meniul Simulation a simulatorului si tinand cont de optiunea selectata la Rate.

Observatii utile : 1. Inainte de a da Start unei executii asigurati-va ca simularea curenta este oprita.2. Analizati inainte de incarcarea programului outputul de la asamblare pentru corectia eventualelor erori de codare.3. Atentie intotdeauna la harta de memorie intrucat ofera o informatie utila daca codul a fost scris corespunzator (daca instructiunile sunt la adresele corespunzatoare).4. Atentie la indentarea instructiunilor, mentineti pe cat posibil aspectul codului sursa dat ca model.5. Comentati codul scris. Comentariile se introduc prin caracterul ; .6. Pentru accesarea vizuala a locatiilor de memorie se concateneaza valorile care se afla pe prima coloana (de la 0000 la FFF0) cu valorile de la coloane (de la 0 la F).7. Specificati de fiecare data la finalul unei valori si sufixul h/H intrucat tipul de reprezentare in baza de numeratie este verificat (noi vom lucra in general in hexa).8. Intrucat avem limitari pe transferul intre anumite registre utilizam registrul A pentru a intermedia orice transfer, intrucat acesta nu are limitari.

9. Utilizati cat de mult puteti lista cu setul de instructiuni pentru sintaxa corecta !

Page 11: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Dezvoltarea primelor aplicatii in limbaj de asamblare

Prima aplicatie propusa pentru dezvoltare consta in realizarea transferului unor octeti de date din memorie intr-un registru al procesorului si dintr-un registru al procesorului in memorie la o anumita adresa sau intre registrii procesorului.

EX1. Sa se transfere din memorie de la adresa 0243H un octet de date in registrul acumulator A. Sa se transfere apoi valoarea din registrul A in locatia 89ACH. Sa se transfere octetul din registrul B la adresa de memorie A5D9H (utilizand registrul A intrucat doar acesta poate realiza acest tip de operatii – completari la modurile de adresare). Se considera ca in locatia 0243H vom plasa manual un octet in editorul de memorie.

; program pentru ilustrarea instructiunilor de transfer pe 8 biti ld a,(0243h) ; plasam in reg A valoarea de la adresa 0243h din memorie(ex: EEh) ld (089ach),a ; plasam in memorie la locatia 089ach valoarea din reg A ld b,32h ; scrie in registrul B valoarea 32h ld a,b ; transferam in registrul A continutul registrului B ld (0a5d9h),a ; scriem in locatia de memorie 0a5d9h valoarea din reg A halt

Analiza excutiei este redata in continuare, putandu-se observa cum dupa executie locatiile de memorie sunt ocupate cu octetii corespunzatori si registrii au valorile corespunzatoare executiei codului.

Page 12: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

EX2. Sa se dezvolte un program care preia pe rand cate un octet de la adresele 0056h, 0057h si 0058h si le plaseaza in memorie la adresele 0066h, 0067h, 0068h utilizand un registru de 16 biti pentru retinerea valorilor pe 16 biti preluate. Datele vor fi preintroduse manual in memorie.

; program pentru ilustrarea instructiunilor de transfer pe 16 biti ld hl,(0056h) ; plasam in registrul HL continutul locatiei 0056h ld (0066h),hl ; plasam in locatia 0066h continutul lui HL ld hl,(0057h) ; plasam in registrul HL continutul locatiei 0057h ld (0067h),hl ; plasam in locatia 0067h continutul lui HL ld hl,(0058h) ; plasam in registrul HL continutul locatiei 0058h ld (0068h),hl ; plasam in locatia 0068h continutul lui HL halt

Analiza executiei este redata in continuare.

EX3. Sa se copie octetii de date din memorie incepand cu adresa 0044h pana la 0048h la adresele incepand cu 00d5h pana la 00d9h utilizand un registru index (IX sau IY). Octetii de date de la adresele sursa vor fi preintrodusi in editorul de memorie.

Page 13: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Registrul index (IX sau IY) permite accesarea locatiilor de memorie consecutive referind o adresa de baza si adaugandu-i un deplasament (hexa) egal cu distanta intre adresele consecutive. Forma generala este (IX+d), unde d este deplasament si ( ) inseamna ca se preia continutul locatiei de memorie data de IX+d, IX trebuind sa fie initializat. Reamintim ca avem limitari pe transferul intre anumite registre si astfel utilizam registrul A pentru a intermedia orice transfer, intrucat acesta nu are limitari.; program care prezinta lucrul cu registrii index ld ix,0044h ; se incarca in IX adresa sursa de referinta (la care ne raportam) ld iy,00d5h ; se incarca in IY adresa destinatie de referinta (la care ne raportam) ld a,(ix+0h) ; se plaseaza in A continutul locatiei 0044h ld (iy+0h),a ; transferam valoarea din A in locatia 00d5h ld a,(ix+1h) ; se plaseaza in A continutul locatiei 0045h ld (iy+1h),a ; transferam valoarea din A in locatia 00d6h ld a,(ix+2h) ; se plaseaza in A continutul locatiei 0046h ld (iy+2h),a ; transferam valoarea din A in locatia 00d7h ld a,(ix+3h) ; se plaseaza in A continutul locatiei 0047h ld (iy+3h),a ; transferam valoarea din A in locatia 00d8h ld a,(ix+4h) ; se plaseaza in A continutul locatiei 0048h ld (iy+5h),a ; transferam valoarea din A in locatia 00d9h halt ; final program, opreste UCP

Page 14: Programare in limbaj de asamblare Lucrarea de laborator nr · Operaţii simple cu numere scrise în diferite baze În continuare vor fi prezentate operaţiile de adunare şi scădere

Se poate observa in timpul executiei ca IX ramane constant si noi ne raportam la acesta printr-un deplasament pentru a accesa urmatoarele locatii de memorie (locatii de memorie consecutive).

Cerinta :

1. Sa se scrie in registrul B valoarea 80h si in registrul C valoarea 10h prin intermediul unei instructiuni de 16biti.2. Sa se scrie un program in asamblare care sa schimbe continutul locatiilor de memorie RAM abcdh si dcbah, tinand cont ca acestea contin octetii 5dh si 78h. Octetii de date trebuie sa fie introdusi prin program utilizand instructiuni de transfer.