Sunteți pe pagina 1din 12

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4)

LUCRAREA 4 PROGRAME CU RAMIFICARI SI BUCLE 4.1. SCOPUL LUCRARII Lucrarea urmareste deprinderea studentilor cu proiectarea si implementarea programelor cu ramificatii si bucle in limbaj de asamblare. Se prezinta citeva exemple tipice de astfel de programe, incluzind citeva metode elementare de sortare si cautare. De asemenea se prezinta citeva implementari de operatii aritmetice care necesita utilizarea unor structuri de control de tip ramificare si buclare. Se vor utiliza instructiunile de comparare, salt si buclare. Se prezinta de asemenea si citeva exemple de utilizare a instructiunilor logice. 4.2. CHESTIUNI TEORETICE 4.2.1. Instructiuni de salt Instructiunea de salt neconditionat JMP Forma generala : JMP operand unde operand este adresa de salt neconditionat. Exista urmatoarele tipuri de instructiuni JMP: de tip SHORT - cand operandul specifica o adresa in domeniul -128 +127 fata de (IP) actualizat de tip NEAR - operandul specifica o adresa din acelasi segment de cod; de tip FAR - operandul specifica o adresa din alt segment de cod. Aceste tipuri pot fi explicitate cu ajutorul operatorului PTR astfel: JMP SHORT PTR operand JMP NEAR PTR operand JMP FAR PTR operand sau se deduc din atributele expresiei care formeaza operandul. Deci pentru fiecare tip semnificatia este: JMP de tip SHORT: (IP) (IP) + distanta dintre offset-ul curent si cel al operandului JMP de tip NEAR: (IP) offset-ul adresei operandului JMP de tip FAR: (IP) offset-ul adresei operandului (CS) segmentul adresei operandului Instructiuni de salt conditionat Aceste instructiuni implementeaza saltulrile conditionate de indicatorii de conditie. Forma generala: Jcond operand unde - cond este conditia de salt si este reprezentata de una sau doua litere (vezi tabelul de mai jos); - operand este un offset cuprins intre -128 si 128. Daca conditia este indeplinita are loc saltul la adresa data de operand, daca nu - se continua in secventa. Se observa ca exista 2 categorii de instructiuni pentru mai mic si mai mare, cele care contin cuvintele above sau bellow si cele care contin cuvintele less sau greater. Primele se folosesc in situatia compararii a doua valori fara semn, iar ultimele in situatia compararii a doua valori cu semn. Fie secventele de program:
mov ax,0FFFEh mov bx, 2 cmp ax, bx ja alfa

si

mov ax, 0FFFEh mov bx, 2

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) cmp ax, bx jg alfa

in care se compara pe cuvant 0FFFEh si 2. Se observa ca (AX) > (BX) daca cele doua valori se considera reprezentate fara semn si ca (AX) < (BX) daca cele doua valori se considera cu semn. (-2 este mai mic decat 2). Ca atare in primul caz saltul la eticheta alfa are loc, pe cand in cel de-al doilea caz nu are loc.
Instructiune (mnemonica) JE, JZ JL, JNGE JLE,JNG JB, JNAE, JC JBE, JNA JP, JPE JO JS JNE, JNZ JNL, JGE JNLE, JG JNB, JAE, JNC JNBE, JA JNP, JPO JNO JNS Conditie de salt ZF = 1 SF OF SF OF sau ZF = 1 CF = 1 CF = 1 sau ZF = 1 PF = 1 OF = 1 SF = 1 ZF = 0 SF = OF SF = OF si ZF = 0 CF = 0 CF = 0 si ZF = 0 PF = 0 OF = 0 SF = 0 Interpretare Zero, Equal Less, Not Greater or Equal Less or Equal, Not Greater Below, Not Above or Equal, Carry Below or Equal, Not Above Parity, Parity Even Overflow Sign Not Zero, Not Equal Not Less, Greater or Equal Not Less or Equal, Greater Not Below, Above or Equal, Not Carry Not Below or Equal, Above Not Parity, Parity Odd Not Overflow Not Sign

4.2.2. Instructiuni de ciclare. Instructiunea JCXZ (JUMP if CX is Zero) Instructiunea realizeaza salt la etcheta specificata daca continutul registrului CX este zero. Forma generala: JCXZ eticheta unde eticheta este o eticheta aflata in domeniul -128 si 127 fata de (IP) Instructiunea LOOP Are ca efect: cx cx -1 daca cx = 0 atunci (IP) (IP) + D8 adica se decrementeaza CX si daca acesta este diferit de zero se sare la eticheta specificata, in caz contrar se continua cu instructiunea urmatoare. D8 este un deplasament pe 8 biti si reprezinta diferenta intre offset-ul instructiunii urmatoare instructiunii LOOP si offset-ul etichetei. Forma generala: LOOP eticheta Ex: Suma celor n octeti de la adresa sir.
.data sir db 7, 9, 15, 25, -18, 33, 11 n equ ($ - sir)/type sir suma db ? .code begin: mov ax, @data mov ds, ax xor al, al mov cx, n xor si, si repeta: add al, sir[si] inc si LOOP repeta mov suma, al mov ax, 4c00h

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) int 21h end begin

Instructiunea LOOPZ/LOOPE (LOOP While Zero/Equal) Forma generala: LOOPZ eticheta sau LOOPE eticheta Semnificatia: cx cx - 1 daca cx = 0 si ZF = 1 atunci (IP) (IP) + D8 Se decrementeaza cx si daca acesta este diferit de zero si indicatorul ZF este 1 (rezultatul ultimei operatii aritmetice a fost zero) se sare la eticheta specificata. Instructiunea LOOPNZ/LOOPNE (Loop While Not Zero/Not Equal) Forma generala: LOOPNZ eticheta sau LOOPNE eticheta Semnificatia: cx cx - 1 daca cx 0 si ZF = 0 atunci (IP) (IP) + D8 Efectul este ca se cicleaza cat timp rezultatul ultimei operatii aritmetice este diferit de zero, dar nu de mai multe ori cat este continutul initial a lui cx. 4.2.3. Instructiuni de deplasare (SHL, SAL, SHR, SAR) si de rotatie (ROL, RCL, ROR, RCR). Acest grup de instructiuni realizeaza operatii de deplasare si de rotatie la nivel de bit. Instructiunile au doi operanzi: primul este operandul propriu-zis, iar al doilea este numarul de biti cu care se deplaseaza sau se roteste primul operand. Ambele operatii se pot face la dreapta sau la stinga. Deplasarea inseamna translatarea tuturor bitilor din operand la stinga/dreapta, cu completarea unei valori fixe in dreapta/stinga si cu pierderea bitilor din stinga/dreapta. Deplasarea cu un bit la stinga este echivalenta cu inmultirea operandului cu 2, iar deplasarea la dreapta, cu impartirea operandului la 2. Rotatie inseamna translatarea tuturor bitilor din operand la stinga/dreapta, cu completarea in dreapta/stinga cu bitii care se pierd in partea opusa. Ambele operatii se fac cu modificarea bistabilului CF, care poate chiar participa la operatiile de rotatie. Forma generala a instructiunilor este: OPERATIE operand, contor in care operand este un registru sau o locatie de memorie de 8 sau 16 biti, iar contor (numarul de biti) este fie constanta 1, fie registrul CL, care contine numarul de biti cu care se deplaseaza/roteste operandul. Procesoarele mai avansate (80286 si peste) accepta un numar oarecare de biti, specificat si printr-o constanta intreaga. La operatiile de deplasare , se modifica toate flagurile conform rezultatului, in afara de AF, care este nedefinit. La operatiile de rotatie, se modifica numai CF si OF. La instructiunile de deplasare, se considera deplasari logice si aritmetice, care se pot utiliza dupa natura operanzilor. Instructiunea SHL/SAL (Shift Logic/Arithmetic Left) Are forma generala: SHL/SAL operand, contor Desi exista doua mnemonice (SHL si SAL), in fapt este vorba de o unica instructiune. Bitul cel mai semnificativ al operandului trece in CF, dupa care toti bitii se deplaseaza la stanga cu o pozitie. Operatia se repeta de atitea ori de cat este valoarea lui contor (1 sau continutul registrului CL).

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4)

Instructiunea SHR (Shift Logic Right) Are forma generala: SHR operand, contor Bitul cel mai putin semnificativ din operand trece in CF, dupa care se deplaseaza toti bitii cu o pozitie la dreapta (impartire la 2). Faptul ca operatia de impartire se executa fara semn inseamna ca se completeaza cu un bit 0 dinspre stinga. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). Instructiunea SAR (Shift Arithmetic Right) Are forma generala: SAR operand, contor Bitul de semn ramine nemodificat. Bitul cel mai putin semnificativ din operand trece in CF, dupa care se deplaseaza toti bitii cu o pozitie la dreapta . Faptul ca operatia de deplasare se executa cu semn inseamna ca se completeaza toti bitii eliberati cu bitul de semn. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). Instructiunea ROL (Rotate Left) Are forma generala: ROL operand, contor Bitul cel mai semnificativ din operand trece atit in CF, cat si in bitul cel mai putin semnificativ din operand, dupa ce toti bitii acestuia s-au deplasat la stanga cu o pozitie. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). Instructiunea ROR (Rotate Right) Are forma generala: ROR operand, contor Bitul cel mai putin semnificativ din operand trece atit in CF, cat si in bitul cel mai semnificativ din operand, dupa ce toti bitii acestuia s-au deplasat la dreapta cu o pozitie. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). Instructiunea RCL (Rotate Left through Carry) Are forma generala: RCL operand, contor Bitul cel mai semnificativ din operand trece in CF, se deplaseaza toti bitii din operand cu o pozitie la stinga, iar CF initial trece in bitul cel mai putin semnificativ din operand. Operatia se repeta de atitea oricit este valoarea lui contor (1 sau continutul registrului CL). Instructiunea RCR (Rotate ight through Carry) Are forma generala: RCR operand, contor Bitul cel mai putin semnificativ din operand trece in CF, se deplaseaza toti bitii din operand cu o pozitie la dreapta, iar CF initial trece in bitul cel mai semnificativ din operand. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). 4.2.4. Instuctiuni logice. Instuctiunile logice realizeaza functiile logice de baza, pe octet sau pe cuvant. Operatiile se fac la nivel de bit. Instuctiunea NOT (Not) Forma generala : NOT dest in care dest poate fi un registru sau o locatie de memorie. Instructiunea provoaca negarea tuturor bitilor operandului, adica se face complementul fata de unu. Instuctiunea AND (And) Forma generala : 4

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4)

AND dest, sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea depune in dest si-logic la nivel de bit intre dest si sursa. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. Instuctiunea OR (Or) Forma generala : OR dest, sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea depune in dest sau-logic la nivel de bit intre dest si sursa. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. Instuctiunea XOR (Exclusive Or) Forma generala : XOR dest,sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea depune in dest xor-logic la nivel de bit intre dest si sursa. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. Instuctiunea TEST (Test) Forma generala : TEST dest,sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea realizeaza and-logic la nivel de bit intre dest si sursa cu pozitionarea indicatorilor. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. 4.3. EXEMPLE COMENTATE. Exemplul 1. {Cautare secventiala} Sa se scrie un program pentru cautarea primului blanc din sirul incepind de la adresa sir. La iesirea din program ax va contine valoarea 0 daca sirul nu contine blancuri, altfel va contine valoarea pozitiei din sir a primului blanc gasit. Se presupune ca sirul sir are l caractere.
TITLE .MODEL .STACK .DATA sir DB l EQU .CODE begin: mov mov mov mov mov urm: inc cmp loopne jne mov sub jmp nu_gasit: mov iesire: nop END exemplul_1 SMALL 10h

'Acesta este un sir!' $-sir ax,@DATA ds,ax cx,l si,-1 al,' ' si al,sir[si] urm nu_gasit ax,l ax,cx iesire ax,0 begin

Se recomanda ca exercitiu rularea aceluiasi program in situatia in care nu se cunoaste lungimea sirului, ci doar ca acesta este terminat cu caracterul special null, ce are codul ASCII 00h. Exemplul 2. {Adunare in multipla precizie} Urmatoarea secventa de program realizeaza adunarea a doua numere intregi reprezentate in binar in multipla precizie:
TITLE .MODEL exemplul_2 SMALL

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) .STACK 10h .DATA mp1 DW 1111h, 2222h, 3333h, 9999h; Primul numar mp2 DW 7777h, 8888h, 0eeeeh, 1111h; Al doilea numar n EQU ($-mp2)/(TYPE mp2) .CODE begin: mov ax,@DATA mov ds,ax clc lea si,mp1 lea di,mp2 mov cx,n bucla: adc [di],ax add si,2 add di,2 loop bucla END begin

Exemplul 3. {Adunare in cod BCD impachetat} Urmatoarea secventa de program realizeaza adunarea a doua numere in format BCD impachetat avind fiecare cite n octeti:
TITLE exemplul_3 .MODEL SMALL .STACK 10h .DATA DB 22h,41h,75h,32h; 32754122 DB 31h,27h,53h,62h; 62532731 EQU $-bcd2 .CODE mov ax,@DATA mov ds,ax lea si,bcd1 lea di,bcd2 mov cx,n clc mov al,[si] adc al,[di] daa mov [di],al inc si inc di loop bucla END begin

bcd1 bcd2 n begin:

bucla:

Exemplul 4. {Adunare in cod ASCII} Urmatoarea secventa de program realizeaza adunarea a doua numere reprezentate sub forma a doua siruri ASCII avind cite l caractere:
TITLE .MODEL .STACK .DATA DB DB EQU .CODE mov mov lea lea mov clc mov adc aaa mov inc inc loop END exemplul_4 SMALL 10h '7','5',2','1','3'; 31257 '6','1',9','9','5'; 59916 $-asc2 ax,@DATA ds,ax si,asc1 di,asc2 cx,l al,[si] al,[di] [di],al si di bucla begin

asc1 asc2 l begin:

bucla:

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4)

Facem observatia ca adunarea in cod ASCII se poate face direct, fara o conversie preliminara in cod BCD neimpachetat. Exemplul 5. {Inmultirea unui numar reprezentat ca o succesiune de caractere ASCII cu o cifra ASCII} Sa se scrie o secventa de program care realizeaza inmultirea unui numar reprezentat sub forma unui sir de cifre zecimale codificate ASCII cu o cifra ASCII. Rezultatul va fi memorat sub forma unui numar reprezentat in format BCD neimpachetat:
asc1 l dgt asc2 begin: TITLE .CODE DB EQU DB DB .CODE mov mov lea lea mov mov mov and mov inc and mul aam add aaa mov inc mov loop END exemplul_5 '2','4','7','1','3'; 31742 $-asc1 '4' 6 DUP(?) ax,@DATA ds,ax di,asc2 si,asc1 cx,l dl,dgt BYTE PTR [di],0 al,0fh al,[si] si al,0fh dl al,[di] [di],al di [di],ah bucla begin

bucla:

Exemplul 6. {Impartirea unui numar reprezentat sub forma unei succesiuni de cifre zecimale reprezentate in cod ASCII printr-o cifra zecimala} Sa se scrie o secventa de program care realizeaza impartirea unui numar reprezentat sub forma unui sir de cifre zecimale codificate ASCII printr-o cifra zecimala codificata ASCII. Rezultatul va fi memorat sub forma unui numar reprezentat in format BCD neimpachetat:
TITLE .MODEL .STACK .DATA DB DB DB EQU .CODE mov mov lea lea mov mov and xor mov inc and aad div mov inc loop END exemplul_6 SMALL 10h '7','2','1','8','9'; 72189 '6'; 6 5 DUP(?) $-asc2 ax,DATA ds,ax si,asc1 di,asc2 cx,l dl,dgt dl,0Fh ah,ah al,[si] si al,0Fh dl [di],al di bucla begin

asc1 dgt asc2 l begin:

bucla:

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4)

Exemplul 7. {Implementarea unei structuri de selectie} Acest exemplu prezinta o metoda de implementare a unei structuri de selectie utilizind salturi indirecte. Se citeste un caracter de la consola si functie de valoarea acestuia se executa urmatoarele actiuni: daca valoarea caracterulaui este 'a' se afiseaza sirul 'Alfa', daca valoarea caracterului este 'g' se afiseaza sirul 'Gama', daca valoarea caracterului este 'd' se afiseaza sirul 'Delta' altfel se va afisa sirul '***':
TITLE .MODEL .STACK .DATA DB DB DB DB DB DW .CODE mov mov mov int xor cmp ja cmp je inc jmp shl jmp mov mov int jmp mov mov int jmp mov mov int jmp mov mov int mov int END exemplul_7 SMALL 10h 'a','g','d' 'Alfa',13,10,'$' 'Gama',13,10,'$' 'Delta',13,10,'$' '***',13,10,'$' act_a,act_g,act_d ax,@DATA ds,ax ah,01h 21h bx,bx bx,02h act al,cars[bx] gasit bx SHORT urm bx,1 act_tbl[bx] dx,OFFSET sir_a ah,09h 21h SHORT exit dx,OFFSET sir_g ah,09h 21h SHORT exit dx,OFFSET sir_d ah,09h 21h SHORT exit dx,OFFSET sir ah,09h 21h ax,4C00h 21h begin

cars sir_a sir_g sir_d sir act_tbl begin:

urm:

gasit: act_a:

act_g:

act_d:

act: exit:

Exemplul 8. {Simularea unei functii logice} Se presupune ca bitii octetului memorat la adresa octet reprezinta valorile variabilelor logice x7, x6, x5, x4, x3, x2, x1, x0. Sa se evalueze urmatoarea functie logica:
f ( x 7 , x 6 ,..., x 0 ) = x 7 x 5 x1 x 0 + x 3 x 2 x 0 + x 6 x 4 x1
TITLE exemplul_8_1 .MODEL SMALL .STACK 10h .DATA DB 10010011b .CODE mov ax,@DATA mov ds,ax mov al,octet mov bl,01011100b or bl,al mov bh,11110010b or bh,al

depunind rezultatul in ah:

octet start:

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) mov cl,10101101b or cl,al xor bl,11011111b jz true xor bh,11111110b jz true xor cl,11101101b jz true xor ah,ah jmp SHORT continue true: mov ah,1 continue: nop END start

Se poate da urmatorul algoritm general de calcul a valorii unei functii logice specificata printr-o forma normala disjunctiva, presupunind cunoscute valorile argumentelor acesteia: 1.Se creaza o tabela de masti avind atitea elemente citi termeni produs are functia. Fiecare element al tabelei va corespunde unui termen produs al functiei si va avea toti bitii corespunzatori variabilelor logice ce lipsesc din termenul produs corespunzator egali cu 1, restul avind valoarea 0; 2.Se face sau logic intre bitii corespunzatori fiecarui element al tabelei de masti si valoarea cuvintului obtinut prin alaturarea valorilor argumentelor functiei. Astfel fiecare element al tabelei va contine in final bitii corespunzatori variabilelor ce lipsesc din termenul produs asociat egali cu 1, iar ceilalti avind valoarea egala cu cea data de valoarea argumentului corespunzator; 3.Se creaza o tabela de coincidenta, fiecare element al ei corespunzind unui termen produs al functiei. Fiecare element al tabelei are egali cu 1 bitii corespunzatori variabilelor ce lipsesc din termenul produs asociat sau sint nenegate in acest termen, restul fiind 0; 4.Daca cele doua tabele au doua elemente, ce corespund unui acelasi termen produs al functiei, egale bit cu bit, atunci functia logica va avea valoarea logica 1, altfel 0. Testarea acestui lucru se va face realizind sau exclusiv bit cu bit intre elementele de acelasi rang ale celor doua tabele, ce corespund unor aceiasi termeni produs. Daca se obtine cel putin un rezultat nul atunci functia logica are valoarea logica 1, altfel 0. In cazul implementarii anterioare, pentru functia propusa nu s-au creat explicit cele doua tabele, folosindu-se in acest scop constante imediate. Rezultatele de la punctul 2 al algoritmului prezentat s-au memorat in registrele bl, bh respectiv cl. O alta implementare posibila, corespunzatoare cazului general este:
TITLE exemplul_8_2 .MODEL SMALL .STACK 10h .DATA DB 01011100b,11110010b,10101101b DB 11011111b,11111110b,11101101b EQU $-coinc DB 10101010b .CODE mov ax,@DATA mov ds,ax mov di,-1 mov al,octet mov cx,n_ter_p inc di or masti[di],al loop bucl1 mov cx,n_ter_p mov si,-1 inc si mov al,coinc[si] mov ah,coinc[si] xor al,ah jz true

masti coinc n_ter_p octet begin:

bucl1:

bucl2:

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) loop bucl2 xor ah,ah jmp SHORT continue true: mov ah,1 continue: nop END begin

10

Exemplul 9. {Determinarea echivalentului binar al unui octet} Sa se faca un program care determina si afiseaza echivalentul binar al unui octet aflat la adresa octet sub forma unui sir de caractere ASCII ('0', '1').
TITLE .MODEL .STACK .DATA DB DB DB .CODE mov mov mov mov mov dec shr jc mov jmp mov loop mov mov int mov int END exemplul_9 SMALL 10h 8 DUP(?) 13,10,'$' 98h ax,@DATA ds,ax cx,8 al,octet di,cx di al,1 unu echiv[di],'0' SHORT skip echiv[di],'1' bucl dx,OFFSET echiv ah,09h 21h ax,4C00h 21h begin

echiv octet begin:

bucl:

unu: skip:

Exemplul 10. {Conversia unui octet sub forma a doua caractere hexa} Sa se afiseze continutul octetului de la adresa octet sub forma a doua caractere hexazecimale:
TITLE .MODEL .STACK .DATA DB DB DB DB .CODE mov mov mov mov and mov shr mov xor mov mov and mov xor mov mov mov mov int exemplul_10 SMALL 10h '0123456789ABCDEF' 2 DUP(?) 13,10,'$' 98h ax,@DATA ds,ax al,octet ah,al al,0F0h cl,4 al,cl bl,al bh,bh al,ascii[bx] mesaj,al ah,0Fh bl,ah bh,bh al,ascii[bx] mesaj+1,al dx,OFFSET mesaj ah,09h 21h

ascii mesaj octet begin:

10

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) mov ax,4C00h int 21h END begin

11

Pentru conversia unei tetrade intr-un caracter ASCII se poate folosi urmatoarea observatie: -daca valoarea unei tetrade este cuprinsa intre 0 si 9, codul ASCII al cifrei hexa echivalente se obtine adunind valoarea 30h la valoarea tetradei, sau efectuind un sau logic bit cu bit intre un octet ce are tetrada inferioara identica cu tetrada data si tetrada superioara nula cu valoarea 00110000b. -daca valoarea unei tetrade este cuprinsa intre 10 si 15, codul ASCII al cifrei hexa echivalente se obtine adunind valoarea 37h la valoarea tetradei. Sa se rescrie programul anterior utilizind aceasta observatie. Exemplul 11. {Conversie din BCD neimpachetat in BCD impachetat} Sa se scrie o secventa de program care realizeaza conversia unui numar BCD neimpachetat de 16 cifre zecimale in forma impachetata:
TITLE .MODEL .STACK DB DB .CODE mov mov mov mov xor mov mov shl shr mov add inc dec jnz END exemplul_11 SMALL 10h 1,2,4,0,7,8,9,0,6,7,9,1,2,5,8,3 8 DUP(?) ax,@DATA ds,ax dx,8 cl,4 si,si di,si ax,WORD PTR unpck[si] al,cl ax,cl pck[di],al si,2 di dx conv begin

unpck pck begin:

conv:

Exemplul 12. {Umplere ecran cu un sir de caractere citit de la tastatura} Urmatorul program citeste un sir de maxim 16 caractere de la tastatura si afiseaza 24 de linii a cite 80 de caractere pe linie, continind sirul citit:
TITLE .MODEL .STACK .DATA LABEL DB DB DB exemplul_12 SMALL 10h

buffer max_length chars_entered string

strings_per_line DW crlf DB .CODE begin: mov mov mov mov mov int xor mov mov mov cbw div

BYTE ? ; Lungimea maxima ? ; Numarul caracterelor citite 17 DUP(?) ; Tampon pentru 17 caractere, ; se considera si un CR 0 ; Cite siruri incap pe o linie 0Dh,0Ah,'$' ax,@DATA ds,ax dx,OFFSET buffer ; Citire sir buffer,17 ah,0Ah 21h bx,bx bl,chars_entered ; In bl lungimea ; sirului buffer[bx+2],'$' al,80h chars_entered ; De cite ori incape sirul ; pe linie

11

Uniti Centrale ale Calculatoarelor (lucrare de laborator 4) xor ah,ah mov strings_per_line,ax mov cx,24 display_screen:push cx mov cx,strings_per_line display_line: mov dx,OFFSET string ; Afisare sir mov ah,09h int 21h loop display_line mov dx,OFFSET crlf mov ah,09h int 21h pop cx loop display_screen mov ax,4C00h int 21h END begin

12

4.4. PROBLEME PROPUSE. 1. Sa se determine citi biti 1 exista si care sint pozitiile primilor biti 1 de la stinga la dreapta respectiv dreapta la stinga din cuvintul de la adresa cuvint si din dublul cuvint memorat incepind de la adresa dcuvint. 2. Se citeste de la tastatura un sir de maxim 25 de caractere, terminat cu CR si se depune in memorie incepind de la adresa sir. Sa se scrie o secventa de program care efectueaza citirea mentionata si seteaza bitul 5 al registrului dl daca sirul contine cel putin o cifra hexazecimala, altfel acest bit se va pozitiona pe 0. 3. Scrieti o secventa de program care converteste un numar de 16 cifre codificate BCD impachetat incepind de la adresa packed intr-un numar BCD neimpachetat incepind de la adresa unpacked. Modificati apoi secventa anterioara asfel incit sa se obtina numarul codificat sub forma unui sir de caractere ASCII si sa se afiseze apoi sirul respectiv. 4. Sa se scrie o secventa de program care transforma sirul de caractere incepind de la adresa string in rasturnatul sau, numarul de elemente al sirului fiind cunoscut. Aceeasi problema pentru cazul cind nu se cunoaste numarul de caractere din sir, ci doar ca acesta se termina cu un caracter special. 5. Scrieti o secventa de program care impacheteaza 4 entitati a cite 12 biti memorate in 4 cuvinte consecutive de memorie in 3 cuvinte de memorie consecutive. 6. Sa se scrie o secventa de program care citeste un sir de 4 cifre hexa codificate ASCII ce reprezinta un numar hexazecimal, converteste acest numar in format BCD neimpachetat si il depune incepind de la adresa unpacked si realizeaza apoi conversia sa in binar int-un cuvint memorat la adresa binary_word. 7. Sa se faca un program de inmultire a doua numere intregi cu semn reprezentate in dubla precizie pe cite doua cuvinte, dp1 si dp2. 8. Scrieti o secventa de program care citeste un sir de maxim 10 caractere de la tastatura si afiseaza 20 de linii a cite 75 de caractere pe linie, continind sirul citit. 4.5. CONTINUTUL REFERATULUI 1. Programele corespunzatoare exemplelor; 2. Programele elaborate si comentate conform sarcinii individuale;

12

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