Assignment 8
section .data
menu db 10,"----------------- MENU -----------------",10
db 10,"1) HEX to BCD Conversion.",
db 10,"2) BCD to HEX Conversion.",
db 10,"3) Exit.",
db 10,"Enter Your Choice : "
menuLen equ - hbMsg
bmsg db "Equivalent BCD : "
bmsgLen equ - bhMsg
hmsg db "Equivalent HEX : "
hmsgLen equ - newline
section .bss
buf resb 6
bufLen equ $ - buf
digitcount resb 1
ans resw 1
charAns resb 4
%macro print 2
mov rax, 1
mov rdi, 1
mov rsi, %1
mov rdx, %2
syscall
%endmacro
%macro read 2
mov rax, 0
mov rdi, 0
mov rsi, %1
mov rdx, %2
syscall
%endmacro
%macro exit 0
mov rax, 60
mov rdi, 0
syscall
%endmacro
section .text
global _start
_start:
menuLabel:
print menu, menuLen
read buf, bufLen
mov al, [buf]
case1:
cmp byte[buf],'1'
jne case2
call hexToBcd
print newline, newlineLen
jmp menuLabel
case2:
cmp byte[buf],'2'
jne case3
call bcdToHex
print newline, newlineLen
jmp menuLabel
case3:
cmp byte[buf],'3'
je exit
hexToBcd:
print hbMsg, hbMsgLen
call hexNum
mov rax, rbx
mov rbx, 10
back:
xor rdx, rdx
div rbx
push rdx
inc byte[digitcount]
cmp rax, 0h
jne back
print bmsg, bmsgLen
print_bcd:
pop rdx
add dl, 30h
mov [charAns], dl
print charAns, 1
dec byte[digitcount]
jnz print_bcd
ret
hexNum:
read buf, bufLen
mov rbx, 00
dec rax
mov rcx, rax
mov esi, buf
mov rax, 00
l3:
shl rbx, 4
mov al, [esi]
cmp al, 39h
jbe sub30
sub al, 07h
sub30:
sub al, 30h
add rbx, rax
inc esi
loop l3
ret
bcdToHex:
print bhMsg, bhMsgLen
read buf, bufLen
mov esi, buf
dec rax
mov rcx, rax
xor rax, rax
mov rbx, 10
back1:
xor rdx, rdx
mul rbx
xor rdx, rdx
mov dl, [esi]
sub dl, 30h
add rax, rdx
inc esi
dec rcx
jnz back1
mov [ans], ax
print hmsg, hmsgLen
mov ax, [ans]
call disp16
ret
disp16:
mov esi, charAns+3
mov rcx, 4
cnt:
mov rdx, 0
mov rbx, 16
div rbx
cmp dl, 09h
jbe add30
add dl, 07h
add30:
add dl, 30h
mov [esi],dl
dec esi
dec rcx
jnz cnt
print charAns, 4
ret