3) ALP to convert hex to bcd number
;-----------------------------------------------------------------------------------------------------------
Write X86/64 ALP to convert 4-digit Hex number into its equivalent BCD number and 5-digitBCD number into its equivalent HEX number. Make your program user friendly to accept the choice from user for:
(a) HEX to BCD b) BCD to HEX (c) EXIT.
Display proper strings to prompt the user while accepting the input and displaying the result. (wherever necessary, use 64-bit registers)
;---------------------------------------------------------------------------------------------------------
;Macro for print and read
%macro print 2
mov rax,1
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro read 2
mov rax,0
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
;---------------------------------------
section .data
menu: db
"=====================================",10
db " MENU ",10
db
"=====================================",10
db "Enter your
choice",10
db "1. Hex to
BCD",10
db "2.BCD to
hex",10
db
"3.Exit",10
menulen: equ $-menu
msg1: db "Enter
the number",10
len1: equ $-msg1
blank: db
"",10
blen: equ $-blank
section .bss
choice resb 2
hexcode resb 5
bcdcode resb 5
count resb 1
ascdigit resb 1
asciicode resb 4
section .text
global _start:
_start:
print menu,menulen
read choice,2
cmp byte[choice],31h
je hod
cmp byte[choice],32h
je doh
cmp byte[choice],33h
je exit
jmp _start ;jump to
start if invalid choice is entered
hod: ;hex to bcd
print msg1,len1
read hexcode,5
mov byte[count],4
call hextoascii
;value at dx is hexadecimal ie binary
mov byte[count],0
mov rax,0h
mov ax,dx
mov rdx,0h
mov rbx,0Ah
back:
div rbx
push dx
mov rdx,0
inc byte[count]
cmp ax,0h
jnz back
repeat:
pop dx
add dl,30h
mov byte[ascdigit],dl
print ascdigit,1
dec byte[count]
jnz repeat
print blank,blen
jmp _start
doh: ;bcd to hex
print msg1,len1
read bcdcode,6
mov rbx,10
mov rdx,0
mov rax,0
mov byte[count],5
mov rsi,bcdcode
;converting to decimal
unpack:
mul rbx
sub byte[rsi],30h
movsx cx,byte[rsi] ;move with sign extended
add ax,cx
inc rsi
dec byte[count]
jnz unpack
;now we have the decimal value. Convert we have hex val
mov byte[count],4
mov rsi,asciicode
again:
rol ax,4
mov bl,al
and bl,0Fh
cmp bl,9
jbe nocorrection2
add bl,7
nocorrection2:
add bl,30h
mov byte[rsi],bl
inc rsi
dec byte[count]
jnz again
print asciicode,4
print blank,blen
jmp _start
exit: ;exit system
call
mov rax,60
mov rdx,0h
syscall
hextoascii:
mov ax,0h
mov dx,0h
mov rsi,hexcode
back2:
rol dx,4
mov al,byte[rsi]
sub al,30h
cmp al,9
jbe nocorrection
sub al,7h
nocorrection:
add dx,ax
add rsi,1
dec byte[count]
jnz back2
ret
;Output
srttc@srttc:~$ gedit prg3.asm
srttc@srttc:~$ nasm -f elf64 prg3.asm
srttc@srttc:~$ ld -o pp prg3.o
srttc@srttc:~$ ./pp
=====================================
MENU
=====================================
Enter your choice
1. Hex to BCD
2.BCD to hex
3.Exit
1
Enter the number
000F
15
=====================================
MENU
=====================================
Enter your choice
1. Hex to BCD
2.BCD to hex
3.Exit
2
Enter the number
00015
000F
=====================================
MENU
=====================================
Enter your choice
1. Hex to BCD
2.BCD to hex
3.Exit
0 comments:
Post a Comment