Se citesc 2 caractere in hexa: ex. FF
Programul va afisa rezultatul: ex. 255
.model small
.stack 100
.data
text1 db 10, 13, 'Introduceti un numar in hexa: $'
text2 db 10, 13, 'Rezultat: $'
text3 db 10, 13, 'Caracter invalid, introdu altul: $'
.code
ascii_to_hex proc
push dx
cmp al, '0'
jb eroare
cmp al, '9'
jb interval_0_9
cmp al, 'A'
jb eroare
cmp al, 'F'
jbe interval_A_F_uppercase
cmp al, 'a'
jb eroare
cmp al, 'f'
jbe interval_a_f_lowercase
eroare:
; afisare: Caracter invalid
mov ah, 9
lea dx, text3
int 21h
; setam valoarea 0
mov al, 10h
jmp done
interval_a_f_lowercase:
sub al, 87 ; 'A' - 10
jmp done
interval_A_F_uppercase:
sub al, 55 ; 'A' - 10
jmp done
interval_0_9:
sub al, '0'
jmp done
done:
pop dx
ret
ascii_to_hex endp
citeste_hex proc
introdu_alt_nr:
mov ah, 1
int 21h
call ascii_to_hex
cmp al, 10h
jae introdu_alt_nr
ret
citeste_hex endp
start:
mov ax, @data
mov ds, ax
; afisare: Introduceti un numar in hexa:
mov ah, 9
lea dx, text1
int 21h
; citire caracter1
call citeste_hex
mov bl, al ; salvam rezultatul in bl
shl bl, 4 ; mutam rezultatul in partea high a bl
; citire caracter2
call citeste_hex
or bl, al ; bl = bl | al;
mov cx, 0
mov al, bl
mov dx, 0
reia:
mov ah, 0
mov dl, 10
div dl ; impartim la 10
mov dl, ah ; salvam restul impartirii in dl
push dx ; salvam restul impartirii pe stiva
inc cx ; salvam numarul de caractere impinse pe stiva
cmp al, 0
jne reia
; in principiu daca numarul intial era 126,
; pe stiva am fi pus : 6 2 1 iar in cx am avea valoarea 3
; afisare: Rezultat
mov ah, 9
lea dx, text2
int 21h
afiseaza_rez:
pop dx ; pop de pe stiva a resturilor / 'in ordine inversa'
add dl, 48 ; dl + '0' conversie in ascii
mov ah, 2
int 21h
loop afiseaza_rez
; procedura exit
mov ah, 4ch
int 21h
end start
end start
Programul va afisa rezultatul: ex. 255
.model small
.stack 100
.data
text1 db 10, 13, 'Introduceti un numar in hexa: $'
text2 db 10, 13, 'Rezultat: $'
text3 db 10, 13, 'Caracter invalid, introdu altul: $'
.code
ascii_to_hex proc
push dx
cmp al, '0'
jb eroare
cmp al, '9'
jb interval_0_9
cmp al, 'A'
jb eroare
cmp al, 'F'
jbe interval_A_F_uppercase
cmp al, 'a'
jb eroare
cmp al, 'f'
jbe interval_a_f_lowercase
eroare:
; afisare: Caracter invalid
mov ah, 9
lea dx, text3
int 21h
; setam valoarea 0
mov al, 10h
jmp done
interval_a_f_lowercase:
sub al, 87 ; 'A' - 10
jmp done
interval_A_F_uppercase:
sub al, 55 ; 'A' - 10
jmp done
interval_0_9:
sub al, '0'
jmp done
done:
pop dx
ret
ascii_to_hex endp
citeste_hex proc
introdu_alt_nr:
mov ah, 1
int 21h
call ascii_to_hex
cmp al, 10h
jae introdu_alt_nr
ret
citeste_hex endp
start:
mov ax, @data
mov ds, ax
; afisare: Introduceti un numar in hexa:
mov ah, 9
lea dx, text1
int 21h
; citire caracter1
call citeste_hex
mov bl, al ; salvam rezultatul in bl
shl bl, 4 ; mutam rezultatul in partea high a bl
; citire caracter2
call citeste_hex
or bl, al ; bl = bl | al;
mov cx, 0
mov al, bl
mov dx, 0
reia:
mov ah, 0
mov dl, 10
div dl ; impartim la 10
mov dl, ah ; salvam restul impartirii in dl
push dx ; salvam restul impartirii pe stiva
inc cx ; salvam numarul de caractere impinse pe stiva
cmp al, 0
jne reia
; in principiu daca numarul intial era 126,
; pe stiva am fi pus : 6 2 1 iar in cx am avea valoarea 3
; afisare: Rezultat
mov ah, 9
lea dx, text2
int 21h
afiseaza_rez:
pop dx ; pop de pe stiva a resturilor / 'in ordine inversa'
add dl, 48 ; dl + '0' conversie in ascii
mov ah, 2
int 21h
loop afiseaza_rez
; procedura exit
mov ah, 4ch
int 21h
end start
end start