19
Probleme model pentru testul practic 1. Preluare de la tastaturӑ: ZECIMAL - Pentru numere fӑrӑ semn: 1a) Se preia un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): 0,1,…, 9 1b) Se preia un numӑr zecimal format din 2 cifre (zecimale): 0,1,…, 99 1c) Se preia un numӑr zecimal format din 3 cifre (zecimale)*: 0,1,…, 255 -> (sӑ încapӑ într-un registru de 8 biți) 1d) Se preia un numӑr zecimal format din 5 cifre (zecimale)*: 0,1,…, 65 535 -> (sӑ încapӑ într-un registru de 16 biți) ZECIMAL - Pentru numere cu semn: (nu se cere) 1aa) Se preia un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): -9,-8,…,-1,0,1,…, 9 1bb) Se preia un numӑr zecimal format din 2 cifre (zecimale): -99, -98, …-1, 0, 1, …, 99 1cc) Se preia un numӑr zecimal format din 3 cifre (zecimale)*: -128, …, -1, 0,1,…, +127 -> (sӑ încapӑ într- un registru de 8 biți) 1dd) Se preia un numӑr zecimal format din 5 cifre (zecimale)*: -32 768, …, -1, 0,1,…, 32 767 -> (sӑ încapӑ într-un registru de 16 biți) HEXAZECIMAL - Pentru numere de forma o cifrӑ hexa, 2 cifre hexa, 4 cifre hexa: 1e) Se preia un numӑr hexazecimal format din o singurӑ cifrӑ (hexazecimalӑ): 0,1,…, 9, A, B, C, D, E, F sau 0,1,…, 9, a, b, c, d, e, f 1f) Se preia un numӑr hexazecimal format din 2 cifre (hexazecimale): 00h … FFh 1g) Se preia un numӑr hexazecimal format din 4 cifre (hexazecimale): 0000h … FFFFh BINAR - Pentru numere de forma 8 biți, BINAR - Pentru numere de forma 16 biți : 2. Afișarea pe ecran: ZECIMAL - Pentru numere fӑrӑ semn: 2a) Se va afișa un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): 0,1,…, 9 2b) Se va afișa un numӑr zecimal format din douӑ cifre (zecimale): 00,…, 99 2c) Se va afișa un numӑr zecimal format din trei cifre (zecimale): 000,…, 255 (deci cât încape în reg AL ca nr fӑrӑ semn) 2d) tema 2e) Se afișeazӑ un numӑr hexazecimal format din o singurӑ cifrӑ (hexazecimalӑ): 0h,…,Fh sau 0h,.., fh 2f) Se afișeazӑ un numӑr hexazecimal format din douӑ cifre (hexazecimale): 00h,…,FFh sau 00h,.., ffh 2g) Se afișeazӑ un numӑr hexazecimal format din patru cifre (hexazecimale): 0000h,…,FFFFh sau 0000h,.., ffffh Prelucrari posibile (aplicate la nivel de elemente ale unui sir): - Sa verificam daca un nr este par/ impar/ multiplu de 3, de 5, - Sa verificam daca un nr este pozitiv sau negativ - Sa verificam daca un nr scris pe 16 biti contine in scrierea hexazecimala minim 2 litere - Sa verificam daca un nr scris pe 8 biti contine minim 5 biti de 1 - Sa verificam daca un nr scris pe 16 biti contine in prima jumatate minim 3 biti de 0 - Sa verificam daca un nr scris pe 16 biti contine intre bitii de ordin 5 si 13 un nr de minim 3 biti de 0 - Se da un nr in binar, scris pe 8 biti; sa se obtina din el un alt numar care sa aiba primii 4 biti inversati ca pozitie cu ultimii 4 biti

2. Afișarea pe ecran

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2. Afișarea pe ecran

Probleme model pentru testul practic

1. Preluare de la tastaturӑ: ZECIMAL - Pentru numere fӑrӑ semn: 1a) Se preia un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): 0,1,…, 9 1b) Se preia un numӑr zecimal format din 2 cifre (zecimale): 0,1,…, 99 1c) Se preia un numӑr zecimal format din 3 cifre (zecimale)*: 0,1,…, 255 -> (sӑ încapӑ într-un registru de 8 biți) 1d) Se preia un numӑr zecimal format din 5 cifre (zecimale)*: 0,1,…, 65 535 -> (sӑ încapӑ într-un registru de 16 biți) ZECIMAL - Pentru numere cu semn: (nu se cere) 1aa) Se preia un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): -9,-8,…,-1,0,1,…, 9 1bb) Se preia un numӑr zecimal format din 2 cifre (zecimale): -99, -98, …-1, 0, 1, …, 99 1cc) Se preia un numӑr zecimal format din 3 cifre (zecimale)*: -128, …, -1, 0,1,…, +127 -> (sӑ încapӑ într-un registru de 8 biți) 1dd) Se preia un numӑr zecimal format din 5 cifre (zecimale)*: -32 768, …, -1, 0,1,…, 32 767 -> (sӑ încapӑ într-un registru de 16 biți)

HEXAZECIMAL - Pentru numere de forma o cifrӑ hexa, 2 cifre hexa, 4 cifre hexa: 1e) Se preia un numӑr hexazecimal format din o singurӑ cifrӑ (hexazecimalӑ): 0,1,…, 9, A, B, C, D, E, F sau 0,1,…, 9, a, b, c, d, e, f 1f) Se preia un numӑr hexazecimal format din 2 cifre (hexazecimale): 00h … FFh 1g) Se preia un numӑr hexazecimal format din 4 cifre (hexazecimale): 0000h … FFFFh BINAR - Pentru numere de forma 8 biți, BINAR - Pentru numere de forma 16 biți :

2. Afișarea pe ecran: ZECIMAL - Pentru numere fӑrӑ semn: 2a) Se va afișa un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): 0,1,…, 9 2b) Se va afișa un numӑr zecimal format din douӑ cifre (zecimale): 00,…, 99 2c) Se va afișa un numӑr zecimal format din trei cifre (zecimale): 000,…, 255 (deci cât încape în reg AL ca nr fӑrӑ semn)

2d) tema 2e) Se afișeazӑ un numӑr hexazecimal format din o singurӑ cifrӑ (hexazecimalӑ): 0h,…,Fh sau 0h,.., fh 2f) Se afișeazӑ un numӑr hexazecimal format din douӑ cifre (hexazecimale): 00h,…,FFh sau 00h,.., ffh 2g) Se afișeazӑ un numӑr hexazecimal format din patru cifre (hexazecimale): 0000h,…,FFFFh sau 0000h,.., ffffh

Prelucrari posibile (aplicate la nivel de elemente ale unui sir):

- Sa verificam daca un nr este par/ impar/ multiplu de 3, de 5,

- Sa verificam daca un nr este pozitiv sau negativ

- Sa verificam daca un nr scris pe 16 biti contine in scrierea hexazecimala minim 2 litere

- Sa verificam daca un nr scris pe 8 biti contine minim 5 biti de 1

- Sa verificam daca un nr scris pe 16 biti contine in prima jumatate minim 3 biti de 0

- Sa verificam daca un nr scris pe 16 biti contine intre bitii de ordin 5 si 13 un nr de minim 3 biti de 0

- Se da un nr in binar, scris pe 8 biti; sa se obtina din el un alt numar care sa aiba primii 4 biti inversati ca

pozitie cu ultimii 4 biti

Page 2: 2. Afișarea pe ecran

- Se da un nr in binar, scris pe 8 biti; sa se obtina din el un alt numar care sa aiba bitii de pe pozitia 5 si 7

inversati ca valoare

- Se da un nr pe 2 cifre zecimale. Sa se obtina un alt numar ca suma cifrelor primului nr.

- Se da un numar pe 16 biti, in hexazecimal, de exemplu 1234h. Sa se obtina din el nr palindrom la care

primele 2 cifre hexa sa fie cele care se repeta => 1221h

- etc

Prelucrari la nivel de sir:

- Se dau 2 siruri.

o Sa se obtina un al treilea sir prin interclasare

o Sa se obtina un al treilea sir ca suma intre 2 elemente

o Intersectia

o Reuniunea

o Diferenta

- Sa gasim max dintr-un sir

- Sa ordonam un sir (crescator)

- Sa se gaseasca suma elementelor din sir aflate pe pozitie para

- Sa se gaseasca suma elementelor pare din sir

- etc

numerele pot fi considerate cu semn sau fara semn (in reprezentarea zecimala), problema va specifica aceasta

!!! Se poate cere afisarea colorata !!! atentie la pozitionare cursor !

Se da un sir de numere stocate pe octet. Sa se gaseasca suma elementelor pare din sir.

(2p)1. avand un nr in segm de date, verificati daca este par sau impar si afisati un mesaj

Page 3: 2. Afișarea pe ecran

(1p)2. modificati pct 1 astfel încat verificarea sa fie realizata la nivelul unui nr preluat de la tastatura.

(2p)3. Modificati programul obtinut pana acum astfel incat sa foloseasca un macrou care sa preia un sir de 5

valori de la tastatura si sa verifice daca fiecare din nr preluate este par

(2p)4. implementati o subrutina care sa realizeze suma a doua elemente si sa afiseze aceasta suma pe ecran.

(1p)5. repetati 4 astfel incat elementele sa fie insumate doar daca sunt pare

(1p)4. aplicati operatia asupra unui sir care sӑ preia de la tastatura pana la apasarea tastei Esc , cu afisarea

sumei pe ecran

- Verificare daca un nr este par – 1.5p + Afisare mesaj daca este par – 0.5p

- Preluare sir de la tastatura pana la apasarea Esc– 1p

- Calcul suma a 2 nr - 0.5p + Afisare suma pe ecran – 1p

- Formatare macrou + invocare – 1p

- Formatare subrutina + apel – 1p

- Combinarea tuturor subpunctelor – 2.5p

Bonus: + 0.5 pcte pt fiecare instructiune pe sir folosita (max 1p)

Cum putem verifica daca un nr este par ?

1) Div 2 -> AH =0 ?

2) Cu deplasare sau rotire inspre dreapta cu o poz

AL=11001010b -> dreapta cu o singura poz CF ->

jnC EstePar (CF=0) jC NuestePar (CF=1)

3) Test AL, 1 ; AND fictiv intre 1100 1010b si 0000 0001b => 0000 0000b (ZF=1)=> nr este par

Page 4: 2. Afișarea pe ecran

jZ EstePAr

4) JP NuEstePar -> NUUUUU!!! PF nu asta ne arata !!! PF ne arata doar cati biti de 1 avem (daca acel nr este

par sau impar , dar nu ne zice cum sunt distribuiti acei biti de 1)

Cum putem verifica daca un nr (AL) este pozitiv ?

1) Cmp cu 0 -> jG sau jL (cu semn)

2) Shl cu o sg poz -> CF =1 (nr a fost negativ) , CF=0 (nr a fost pozitiv)

3) Test AL, 80h (se testeaza b7)

4) Add AL, 0 ; se va actualiza valoarea cu SF -> sa il verific pe SF =1 (nr negativ) , SF=0 (nr este pozitiv)

10101100b

Xor 01000100b

1100 1010b

AND 1111 0000b

Rez = 1100 0000b

Se da: AL=12h , BL=34h Se cere: CL=13h , DL=42h

And AL, 0F0h ; AL=10h And BL, 0F0h ; BL=30h Shr BL, 4 ; BL=03h Mov CL, AL ; CL=10h Or CL, BL ; CL=13h

And BL, 0Fh ; BL =04h Shl BL, 4 ; BL =40h And AL, 0Fh ; AL=02h Mov DL, BL ; DL =40h Or DL, AL ; DL=42h

Page 5: 2. Afișarea pe ecran

Se da: AL=12h Se cere: AX=0102h Mov AH,0 ; AX=00 12h Shl AX,4 ; AX=01 20h Shr AL,4 ; AX=01 02h

Se da: AX=01 02h Se cere: AL=21h Shl AL, 4 ; AX=01 20h Shr AX, 4 ; AX=00 12h Rol AL, 4 ; AX=00 21h

ZECIMAL - Pentru numere fӑrӑ semn:

1a) Se preia un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): 0,1,…, 9

org 100h .data nr db 0 ; 5h .code ; preiau o tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 5 ->'5'=35h sub AL, 30h ; deformatat din Ascii -> val numerica mov [nr], AL ; ret

1b) Se preia un numӑr zecimal format din 2 cifre (zecimale): 0,1,…, 99

Exemplu: vreau sӑ preiau de la tastaturӑ numӑrul 35 -> în program : tastӑm 3, apoi 5 -> 1. Le deformatӑm (33h și 35h -> 3 și 5) , le combinӑm: 3*10 + 5 = 35

(treizeci și cinci)

org 100h

.data

nr db 0 ; 35=23h

zece db 10

.code

; preiau prima tasta de la tastatura

mov ah,01h

int 21h ; AL=cod Ascii 3 ->'3'=33h

sub AL, 30h ; deformatat din Ascii -> val numerica

mul zece ; rezultatul se obt in AX=>practic AL

mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra

; preiau a doua tasta de la tastatura

mov ah,01h

int 21h ; AL=cod Ascii 5 ->'5'=35h

sub AL, 30h ; deformatat din Ascii -> val numerica

add BL, AL ; in reg BL avem nr nostru

mov [nr], BL ;

Page 6: 2. Afișarea pe ecran

ret

1c) Se preia un numӑr zecimal format din 3 cifre (zecimale)*: 0,1,…, 255 -> (sӑ încapӑ într-un registru de 8 biți)

Exemplu: vreau sӑ preiau de la tastaturӑ numӑrul 235 -> în program : tastӑm 2, apoi 3, apoi 5 -> 1. Le deformatӑm (32h, 33h și 35h -> 2, 3 și 5), 2. le combinӑm :

((2*10) +3)*10 + 5 = (20+3)*10 +5 = 235 (douӑ sute treizeci și cinci)

; fӑrӑ bucle org 100h .data nr db 0 ; 235=0EBh zece db 10 .code ; preiau prima tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 3 ->'3'=33h sub AL, 30h ; deformatat din Ascii -> val numerica mul zece ; rezultatul se obt in AX=>practic AL mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra ; preiau a doua tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 3 ->'3'=33h sub AL, 30h ; deformatat din Ascii -> val numerica add AL, BL mul zece ; rezultatul se obt in AX=>practic AL mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra ; preiau a treia tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 5 ->'5'=35h sub AL, 30h ; deformatat din Ascii -> val numerica add AL, BL ; in reg BL avem nr nostru mov [nr], AL ; ret

; cu buclӑ org 100h .data nr db 0 ; 235=0EBh zece db 10 .code mov CX, 3 mov BX, 0 repeta: ; preiau prima tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 3 ->'3'=33h sub AL, 30h ; deformatat din Ascii -> val numerica add AL, BL ; adunam prin acumulare noua tasta cmp CX, 1 ; vom inmulti cu 10 doar pt primele n-1 taste preluate, nu si pt ultima jbe eti mul zece ; rezultatul se obt in AX=>practic AL mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra eti: loop repeta mov [nr], AL ; ret

; cu bucla pentru preluarea unui sir de 4 elemente si afisare de mesaj la preluarea fiecarui numar org 100h PreiaNr MACRO ;push AX push BX push CX mov CX, 3 mov BX, 0 repeta: ; preiau prima tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 3 ->'3'=33h sub AL, 30h ; deformatat din Ascii -> val numerica add AL, BL ; adunam prin acumulare noua tasta cmp CX, 1 ; vom inmulti cu 10 doar pt primele n-1 taste preluate, nu si pt ultima jbe eti mul zece ; rezultatul se obt in AX=>practic AL mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra eti: loop repeta ; in reg AL se ofera rezultatul macroului pop CX pop BX ; pop AX ENDM .data ;nr db 0 ; 235=0EBh sir db 0,0,0,0 zece db 10 mesaj db 10,13,'Introduceti un nr pe 3 cifre:','$' .code mov CX, 4

Page 7: 2. Afișarea pe ecran

mov SI,0 et: ; afișare mesaj mov dx, offset mesaj mov ah,09h int 21h PreiaNr ; macroul ne va furniza in reg AL mov [sir+SI], AL ; inc SI loop et ret

1d) Se preia un numӑr zecimal format din 5 cifre (zecimale)*: 0,1,…, 65 535 -> (sӑ încapӑ într-un registru de 16 biți)

org 100h

.data

nr dw 0 ; 235=0EBh

zece dw 10

.code

mov CX, 5

mov BX, 0

repeta:

; preiau prima tasta de la tastatura

mov ah,01h

int 21h ; AL=cod Ascii 3 ->'3'=33h

sub AL, 30h ; deformatat din Ascii -> val numerica

mov AH,0

add AX, BX ; adunam prin acumulare noua tasta

cmp CX, 1 ; vom inmulti cu 10 doar pt primele n-1 taste preluate, nu si pt ultima

jbe eti

mul zece ; rezultatul se obt in AX=>practic AL

mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra

eti:

loop repeta

mov [nr], AX ;

ret

Temӑ: faceți voi astfel încât sӑ preia un șir de numere (de forma 1a, 1b, 1c, 1d) pânӑ la apӑsarea tastei Esc

(deci sӑ aibӑ atâtea elemente cât dorește utilizatorul, maxim 20)

Page 8: 2. Afișarea pe ecran

ZECIMAL - Pentru numere cu semn:

1aa) Se preia un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): -9,-8,…,-1,0,1,…, 9

1bb) Se preia un numӑr zecimal format din 2 cifre (zecimale): -99, -98, …-1, 0, 1, …, 99

1cc) Se preia un numӑr zecimal format din 3 cifre (zecimale)*: -128, …, -1, 0,1,…, +127 -> (sӑ încapӑ într-un registru de 8 biți)

1dd) Se preia un numӑr zecimal format din 5 cifre (zecimale)*: -32 768, …, -1, 0,1,…, 32 767 -> (sӑ încapӑ într-un registru de 16 biți)

HEXAZECIMAL - Pentru numere de forma o cifrӑ hexa, 2 cifre hexa, 4 cifre hexa:

1e) Se preia un numӑr hexazecimal format din o singurӑ cifrӑ (hexazecimalӑ): 0,1,…, 9, A, B, C, D, E, F sau 0,1,…, 9, a, b, c, d, e, f

; programul va lucra cu cifre hexa litere MARI org 100h .data nr db 0 ; Ah -> 'A' = 41h ---> 10=0Ah .code ; preiau o tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 5 ->'5'=35h ; caz 1 - cifra intre 0 si 9 - deformatare: scadem 30h ; caz 2 - cifra hexa A...F - deformatare: scadem 41h-0Ah= 37h cmp AL, 39h ja eti: ; tratez caz 1 sub AL, 30h ; deformatat din Ascii -> val numerica jmp comun eti: ; tratez caz 2 sub AL, 37h ; deformatat din Ascii -> val numerica comun: mov [nr], AL ; ret

; programul va lucra cu cifre hexa litere mici org 100h .data nr db 0 ; ah -> 'a' = 61h ---> 10=0Ah .code ; preiau o tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 5 ->'5'=35h ; caz 1 - cifra intre 0 si 9 - deformatare: scadem 30h ; caz 2 - cifra hexa a...f - deformatare: scadem 61h-0Ah= 57h ...

1f) Se preia un numӑr hexazecimal format din 2 cifre (hexazecimale): 00h … FFh

Exemplu: vreau sӑ preiau de la tastaturӑ nr EAh -> în program: tastӑm E, apoi A -> 1. Le deformatӑm (considerand cele 2 cazuri), 2. le combinӑm : E*16 + A

; cu algoritm asemanantor celui de la zecimal ; cu algoritm care combina 2 cifre hexa

Page 9: 2. Afișarea pe ecran

org 100h .data nr db 0 ; EAh saisprezece db 16 .code ; preiau prima tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii ; deformatare pe cele 2 cazuri cmp AL, 39h ja eti: ; tratez caz 1 sub AL, 30h ; deformatat din Ascii -> val numerica jmp comun eti: ; tratez caz 2 sub AL, 37h ; deformatat din Ascii -> val numerica comun: mul saisprezece ; rezultatul se obt in AX=>practic AL mov BX, AX ; il salvam in BX pentru a nu fi suprascris de secv care preia a doua cifra ; preiau a doua tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 5 ->'5'=35h ; deformatare pe cele 2 cazuri cmp AL, 39h ja eti2: ; tratez caz 1 sub AL, 30h ; deformatat din Ascii -> val numerica jmp comun2 eti2: ; tratez caz 2 sub AL, 37h ; deformatat din Ascii -> val numerica comun2: add BL, AL ; in reg BL avem nr nostru mov [nr], BL ; ret

org 100h .data nr db 0 ; EAh .code ; preiau prima tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii ; deformatare pe cele 2 cazuri cmp AL, 39h ja eti: ; tratez caz 1 sub AL, 30h ; deformatat din Ascii -> val numerica jmp comun eti: ; tratez caz 2 sub AL, 37h ; deformatat din Ascii -> val numerica comun: mov BL, AL ; il salvam in BL pentru a nu fi suprascris de secv care preia a doua cifra shl BL, 4 ; deplasam cu 4 pozitii spre stanga ; preiau a doua tasta de la tastatura mov ah,01h int 21h ; AL=cod Ascii 5 ->'5'=35h ; deformatare pe cele 2 cazuri cmp AL, 39h ja eti2: ; tratez caz 1 sub AL, 30h ; deformatat din Ascii -> val numerica jmp comun2 eti2: ; tratez caz 2 sub AL, 37h ; deformatat din Ascii -> val numerica comun2: or BL, AL ; in reg BL avem nr nostru mov [nr], BL ; ret

Varianta 2:

tot pentru hexazecimal: AL = Eh -> BL=0000 1110b + deplasare stg cu 4 poz => BL=1110 0000h

AL=Ah = 0000 1010b

or BL, AL ; BL= 1110 1010h = EAh

1g) Se preia un numӑr hexazecimal format din 4 cifre (hexazecimale): 0000h … FFFFh

tema

Page 10: 2. Afișarea pe ecran

BINAR - Pentru numere de forma 8 biți, 16 biți :

; alg cu inmultire cu 2 org 100h ; .data nr db ? ; orice nr între 0...255 sau -128...+127 sau 0h...0FFh msgI db 'Introduceti nr pe 8 biti : ',10,13,'$' ; mesajul introductiv msgB db ' (b)','$' ; mesajul pt afisarea bazei .code ; afisarea mesajului introductiv mov DX, offset msgI mov Ah,09h int 21h ; se preia prima cifra de la tastatura – aceasta se va gasi în AL mov AH, 1 int 21h ; AL=cod Ascii sub AL, 30h mov CX, 7 repeta: mov BL, 2 mul BL ; nr e destul de mic încât sa încapa în AL, nu trece în AH mov BL, AL ; se preia o noua cifra de la tastatura mov AH, 1 int 21h ; AL=cod Ascii sub AL, 30h ; valoarea noii cifre este în AL add AL, BL ; s-a acumulat si noua cifra la rezultatul anterior loop repeta mov nr, AL

; alg cu deplasare de 1 pozitie spre stanga org 100h ; .data nr db ? ; orice nr între 0...255 sau -128...+127 sau 0h...0FFh msgI db 'Introduceti nr pe 8 biti : ',10,13,'$' ; mesajul introductiv msgB db ' (b)','$' ; mesajul pt afisarea bazei .code ; afisarea mesajului introductiv mov DX, offset msgI mov Ah,09h int 21h ; se preia prima cifra de la tastatura – aceasta se va gasi în AL mov AH, 1 int 21h ; AL=cod Ascii sub AL, 30h mov CX, 7 repeta: shl AL, 1 ; echivalent cu inmultire cu 2 mov BL, AL ; se preia o noua cifra de la tastatura mov AH, 1 int 21h ; AL=cod Ascii sub AL, 30h ; valoarea noii cifre este în AL add AL, BL ; s-a acumulat si noua cifra la rezultatul anterior loop repeta mov nr, AL

Tema: pe 16 biti

2. Afișarea pe ecran:

ZECIMAL - Pentru numere fӑrӑ semn:

2a) Se va afișa un numӑr zecimal format din o singurӑ cifrӑ (zecimalӑ): 0,1,…, 9

org 100h .data nr db 7 .code mov al,nr

TEMA: aplicati afisarea unui nr format dintr-o singura cifra asupra unui sir de 5 astfel de nr

Page 11: 2. Afișarea pe ecran

add AL,30h ; formatam ca Ascii mov ah,0Eh int 10h ret

2b) Se va afișa un numӑr zecimal format din douӑ cifre (zecimale): 00,…, 99

org 100h .data nr db 89 sirCifre db 0,0 ; 8,9 zece db 10 .code mov AL, nr div zece ; nr :10 -> AL=cat=6, AH=rest=7 ; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10 mov [sirCifre+1], AH mov [sirCifre+0], AL ; luam cifrele din sirCifre si le afisam pe rand mov AL, [sirCifre+0] add AL,30h ; formatam ca Ascii mov ah,0Eh int 10h mov AL, [sirCifre+1] add AL,30h ; formatam ca Ascii mov ah,0Eh int 10h

Puteti incerca cu aam Merge si cu aam

ret

2c) Se va afișa un numӑr zecimal format din trei cifre (zecimale): 000,…, 255 (deci cât încape în reg AL ca nr fӑrӑ semn)

Figura Algoritmul folosit pentru obtinerea cifrelor unui nr; de ex pentru nr=254

org 100h .data nr db 189 sirCifre db 0,0,0 ; 1,8,9

org 100h AfiseazaUnNr MACRO push BX push CX

Page 12: 2. Afișarea pe ecran

zece db 10 .code ; algoritm pentru obtinerea cifrelor zecimale ale nr nostru mov AL, nr mov CX, 3-1 ; nr cifre-1 et: mov AH,0 div zece ; nr(AX) :10 -> AL=cat=6, AH=rest=7 ; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10 mov BX, CX ; BX=1 mov [sirCifre+BX], AH dec CX cmp AL,0 jnz et ; algoritm pentru afisarea cifrelor pe ecran mov BX,0 bucla: ; luam cifrele din sirCifre si le afisam pe rand mov AL, [sirCifre+BX] add AL,30h ; formatam ca Ascii mov ah,0Eh int 10h inc BX cmp BX,3 jb bucla ret

; algoritm pt curatarea bufferului sirCifre: mov CX, 3 ; nr cifre et2: mov BX, CX ; BX=1 dec BX mov [sirCifre+BX], 0 loop et2 ; algoritm pentru obtinerea cifrelor zecimale ale nr nostru mov CX, 3-1 ; nr cifre-1 et: mov AH,0 div zece ; nr(AX) :10 -> AL=cat=6, AH=rest=7 ; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10 mov BX, CX ; BX=1 mov [sirCifre+BX], AH dec CX cmp AL,0 jnz et ; algoritm pentru afisarea cifrelor pe ecran mov BX,0 bucla: ; luam cifrele din sirCifre si le afisam pe rand mov AL, [sirCifre+BX] add AL,30h ; formatam ca Ascii mov ah,0Eh int 10h inc BX cmp BX,3 jb bucla pop CX pop BX ENDM .data sir db 189, 34, 6, 255 sirCifre db 0,0,0 ; 1,8,9 zece db 10 msg db 10,13,'Numarul din sir este: ', '$' .code mov bx, 0 mov CX, 4 bucla2: mov dx, offset msg mov AH, 09h int 21h

Page 13: 2. Afișarea pe ecran

mov AL, [sir+bx] AfiseazaUnNr inc BX loop bucla2 ret

ZECIMAL - Pentru numere cu semn:

HEXAZECIMAL - Pentru numere de forma o cifrӑ hexa, 2 cifre hexa, 4 cifre hexa:

2e) Se afișeazӑ un numӑr hexazecimal format din o singurӑ cifrӑ (hexazecimalӑ): 0,1,…, 9, A, B, C, D, E, F sau 0,1,…, 9, a, b, c, d, e, f

org 100h .data nr db 10 ; Ah -> 'A' = 41h ---> 10=0Ah .code mov AL, [nr] ; caz 1 - cifra intre 0 si 9 - formatare: adun 30h ; caz 2 - cifra hexa A...F - formatare: adun 41h-0Ah= 37h cmp AL, 9h ja eti: ; tratez caz 1 add AL, 30h ; deformatat din Ascii -> val numerica jmp comun eti: ; tratez caz 2 add AL, 37h ; deformatat din Ascii -> val numerica comun: ; preiau o tasta de la tastatura mov ah,0Eh int 10h ; AL=cod Ascii 5 ->'5'=35h

Adaptati voi pentru litere mici ; cu xlat org 100h .data nr db 12 ; EAh=234 -> sirHexa db '0123456789ABCDEF' .code mov AL, [nr] mov BX, offset sirHexa xlat ; [BX+AL] -> AL ; preiau o tasta de la tastatura mov ah,0Eh int 10h ; AL=cod Ascii 5 ->'5'=35h ret

2f) Se afișeazӑ un numӑr hexazecimal format din douӑ cifre (hexazecimale): 00h,…,FFh sau 00h,.., ffh

org 100h .data nr db 9Bh ; EAh=234 -> sirHexa db '0123456789ABCDEF' sirCifre db 0,0 ; 8,9 saisprezece db 16 .code mov AL, [nr] mov BX, offset sirHexa

org 100h .data nr db 0EAh ; EAh=234 -> sirHexa db '0123456789ABCDEF' sirCifre db 0,0 ; 8,9 saisprezece db 16 .code mov AL, [nr] mov BX, offset sirHexa

Page 14: 2. Afișarea pe ecran

div saisprezece ; nr :16 -> AL=cat=6, AH=rest=7 ; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10 mov [sirCifre+1], AH mov [sirCifre+0], AL ; luam cifrele din sirCifre si le afisam pe rand mov AL, [sirCifre+0] xlat ; [BX+AL] -> AL ; formatam ca Ascii mov ah,0Eh int 10h mov AL, [sirCifre+1] xlat ; [BX+AL] -> AL mov ah,0Eh int 10h ret

mov BL,AL and BL,11110000b ; 9 shr BL, 4 and AL,00001111b ; B ; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10 mov [sirCifre+1], AL mov [sirCifre+0], BL mov BX, offset sirHexa ; luam cifrele din sirCifre si le afisam pe rand mov AL, [sirCifre+0] xlat ; [BX+AL] -> AL ; formatam ca Ascii mov ah,0Eh int 10h mov AL, [sirCifre+1] xlat ; [BX+AL] -> AL mov ah,0Eh int 10h ret

Cu elemente de sir:

org 100h

.data

sir db 0EAh, 0Bh, 12h, 7Ch ; EAh=234 ->

sirHexa db '0123456789ABCDEF'

sirCifre db 0,0 ; 8,9

msg db 10,13,'Elementul din sir este: ', '$'

.code

mov BX,0

mov CX, 4

bucla:

mov DX, offset msg

mov AH,09h

int 21h

mov AL, [sir+BX]

call AfiseazaUnNr

inc BX

loop bucla

ret

AfiseazaUnNr PROC near

Page 15: 2. Afișarea pe ecran

push BX

push CX

mov BX, offset sirHexa

mov BL,AL

and BL,11110000b ; 9

shr BL, 4

and AL,00001111b ; B

; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10

mov [sirCifre+1], AL

mov [sirCifre+0], BL

mov BX, offset sirHexa

; luam cifrele din sirCifre si le afisam pe rand

mov AL, [sirCifre+0]

xlat ; [BX+AL] -> AL ; formatam ca Ascii

mov ah,0Eh

int 10h

mov AL, [sirCifre+1]

xlat ; [BX+AL] -> AL

mov ah,0Eh

int 10h

pop CX

pop BX

ret

AfiseazaUnNr ENDP

2g) Se afișeazӑ un numӑr hexazecimal format din patru cifre (hexazecimale): 0000h,…,FFFFh sau 0000h,.., ffffh

org 100h

.data

sir dw 0E12Ah, 0ABCDh, 1234h, 7Ch ; EAh=234 ->

sirHexa db '0123456789ABCDEF'

sirCifre db 0,0,0,0 ; 8,9

msg db 10,13,'Elementul din sir este: ', '$'

saisprezece dw 16 ; DX:AX -> cat in AX , restul in DX

.code

mov BX,0

mov CX, 4

bucla:

mov DX, offset msg

mov AH,09h

int 21h

mov AX, [sir+BX]

call AfiseazaUnNr

add BX,2

loop bucla

Page 16: 2. Afișarea pe ecran

ret

AfiseazaUnNr PROC near

push BX

push CX

; algoritm pt curatarea bufferului sirCifre:

mov CX, 4 ; nr cifre

et2:

mov BX, CX ; BX=1

dec BX

mov [sirCifre+BX], 0

loop et2

mov BX, offset sirHexa

; algoritm pentru obtinerea cifrelor hexa in variabila sirCifre

mov CX, 4-1 ; nr cifre-1

et: mov DX,0

div saisprezece ; nr(AX) :10 -> AL=cat=6, AH=rest=7

; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10

mov BX, CX ; BX=1

mov [sirCifre+BX], DL

dec CX

cmp AX,0

jnz et

; salvam in variabila sirCifre cifrele pe care le-am obtinut prin impartire la 10

mov BX,0

mov CX,4

repetam:

mov AL, [sirCifre+BX]

push bx

mov BX, offset sirHexa

; luam cifrele din sirCifre si le afisam pe rand

xlat ; [BX+AL] -> AL ; formatam ca Ascii

mov ah,0Eh

int 10h

pop bx

inc BX

Page 17: 2. Afișarea pe ecran

loop repetam

pop CX

pop BX

ret

AfiseazaUnNr ENDP

BINAR - Pentru numere de forma 8 biți:

BINAR - Pentru numere de forma 16 biți :

Vedeti material Lab 7, Lab 8, (siruri:Lab 9)

Page 18: 2. Afișarea pe ecran

PR5-19. Să se scrie o secvenţă de program prin care să se numere biţii de 1 din registrul AL. Să se afişeze valoarea obţinută pe ecran. Rezolvare:

Se vor folosi instrucţiuni pe biţi pentru deplasare sau rotire (spre dreapta sau spre stânga) şi biţii de 1 vor ajunge pe rând în CF, iar de acolo se vor număra.

Varianta 1: folosind registrul contor CX şi se pot folosi ori deplasări ori rotiri, întrucât se vor efectua fix CX operaţii pe biţi - > condiţie sfârşit: CX=0;

Varianta 2: cu registrul AL şi instrucţiuni de deplasare (biţii de 1 nu se mai „întorc”) – nr de instrucţiuni poate fi mai mic decât în primul caz -> condiţie sfârşit:

se verifică dacă AL a ajuns în starea 0000 0000.

Varianta 1: Varianta 2:

org 100h ; p5_19_1a ; p5_19_1b ; p5_19_2a ; p5_19_2b

.data

nr db 27

cnt db 0

.code

mov AL, nr ; se poate pune orice valoare

mov CX,8

iar:

ror AL,1

jnC et

inc cnt

et: dec CX

cmp CX,0

jnz iar

mov CX,8

mov BL, 01h

iar:

test BL, AL

jZ et

inc cnt

et: shl BL, 1 ; se mută

; poziţia bitului testat

loop iar

iar:

shr AL,1

jnC et

inc cnt

et:

cmp AL,0

jnZ iar

iar:

shr AL,1

adc cnt,0

cmp AL,0

jnZ iar

afisare: mov AL, cnt

add AL,30h ; se formează codul Ascii al valorii obţinute

mov AH, 0Eh ; afişare în mod teletype a unui caracter

int 10h

ret

În loc de secvenţa de instrucţiuni

dec CX

cmp CX,0

jnz iar ; se poate pune loop iar (aşa cum s-a făcut la varianta 1b)).

La varianta 1b) s-a folosit instrucţiunea TEST şi s-a testat pe rând câte un bit din AL: b0, apoi b1, b2, ş.a.m.d. De câte ori acel bit testat este 0, se

incrementează variabila contor cnt; altfel, sare peste această instrucţiune.

Figura 5-5. Afişarea mesajului obţinut la problema PR5-19

Page 19: 2. Afișarea pe ecran