2. Afișarea pe ecran
Transcript of 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
- 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
(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
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
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 ;
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
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)
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
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
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
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
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
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
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
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
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
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)
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