section .data
menu db 10,"-----------Menu----------"
db 10,"1. Hex to BCD "
db 10,"2. BCD to Hex"
db 10,"3. Exit "
db 10
db 10,"Enter your choice: "
menu_len: equ $-menu
hbmsg db 10,"Hex to BCD "
db 10,"Enter 4-digit Hex number: "
hbmsg_len: equ $-hbmsg
bhmsg db 10,"BCD to Hex "
db 10,"enter 5-digit BCD number: "
bhmsg_len: equ $-bhmsg
hmsg db 10,13,"Equivalent Hex number is:"
hmsg_len: equ $-hmsg
bmsg db 10,13,"Equivalent BCD number is: "
bmsg_len: equ $-bmsg
section .bss
buf resb 6
buf_len: equ $-buf
digitcount resb 1
ans resw 1
char_ans resb 4
%macro dispmsg 2
mov rax,4
mov rbx,1
mov rcx,%1
mov rdx,%2
int 80h
%endmacro
%macro accept 2
mov rax,3
mov rbx,1
mov rcx,%1
mov rdx,%2
int 80h
%endmacro
section .text
global _start
_start:
menum:
dispmsg menu, menu_len
accept buf,buf_len
mov al,[buf]
case1: cmp byte[buf],'1'
jne case2
call hex_bcd
jmp menum
case2: cmp byte[buf],'2'
jne case3
call bcd_hex
case3: cmp byte[buf],'3'
je exit
jmp menum
exit:
mov rax,1
mov rbx,0
int 80h
hex_bcd:
dispmsg hbmsg, hbmsg_len
call accept_16
mov ax,bx
mov rbx,10
back:
xor rdx,rdx
div rbx
push dx
inc byte[digitcount]
cmp rax,0h
jne back
dispmsg bmsg, bmsg_len
;--------------------------------------------------------------------------------------------
print_bcd:
pop dx
add dl,30h
mov [char_ans],dl
dispmsg char_ans,1
dec byte[digitcount]
jnz print_bcd
ret
bcd_hex:
dispmsg bhmsg, bhmsg_len
accept buf,buf_len
mov rsi,buf
xor rax,rax
mov rbx,10
mov rcx,05
back1:
xor rdx,rdx
mul ebx
xor rdx,rdx
mov dl,[rsi]
sub dl,30h
add rax,rdx
inc rsi
dec rcx
jnz back1
mov [ans],ax
dispmsg hmsg, hmsg_len
mov ax,[ans]
call display_16
ret
accept_16:
accept buf,5
xor bx,bx
mov rcx,4
mov rsi,buf
next_digit: shl bx,04
mov al,[rsi]
cmp al,39h
jbe sub30
sub al,7h
sub30: sub al,30h
add bx,ax
inc rsi
loop next_digit
ret
display_16:
mov rsi,char_ans+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 [rsi],dl
dec rsi
dec rcx
jnz cnt
dispmsg char_ans,4
ret
menu db 10,"-----------Menu----------"
db 10,"1. Hex to BCD "
db 10,"2. BCD to Hex"
db 10,"3. Exit "
db 10
db 10,"Enter your choice: "
menu_len: equ $-menu
hbmsg db 10,"Hex to BCD "
db 10,"Enter 4-digit Hex number: "
hbmsg_len: equ $-hbmsg
bhmsg db 10,"BCD to Hex "
db 10,"enter 5-digit BCD number: "
bhmsg_len: equ $-bhmsg
hmsg db 10,13,"Equivalent Hex number is:"
hmsg_len: equ $-hmsg
bmsg db 10,13,"Equivalent BCD number is: "
bmsg_len: equ $-bmsg
section .bss
buf resb 6
buf_len: equ $-buf
digitcount resb 1
ans resw 1
char_ans resb 4
%macro dispmsg 2
mov rax,4
mov rbx,1
mov rcx,%1
mov rdx,%2
int 80h
%endmacro
%macro accept 2
mov rax,3
mov rbx,1
mov rcx,%1
mov rdx,%2
int 80h
%endmacro
section .text
global _start
_start:
menum:
dispmsg menu, menu_len
accept buf,buf_len
mov al,[buf]
case1: cmp byte[buf],'1'
jne case2
call hex_bcd
jmp menum
case2: cmp byte[buf],'2'
jne case3
call bcd_hex
case3: cmp byte[buf],'3'
je exit
jmp menum
exit:
mov rax,1
mov rbx,0
int 80h
hex_bcd:
dispmsg hbmsg, hbmsg_len
call accept_16
mov ax,bx
mov rbx,10
back:
xor rdx,rdx
div rbx
push dx
inc byte[digitcount]
cmp rax,0h
jne back
dispmsg bmsg, bmsg_len
;--------------------------------------------------------------------------------------------
print_bcd:
pop dx
add dl,30h
mov [char_ans],dl
dispmsg char_ans,1
dec byte[digitcount]
jnz print_bcd
ret
bcd_hex:
dispmsg bhmsg, bhmsg_len
accept buf,buf_len
mov rsi,buf
xor rax,rax
mov rbx,10
mov rcx,05
back1:
xor rdx,rdx
mul ebx
xor rdx,rdx
mov dl,[rsi]
sub dl,30h
add rax,rdx
inc rsi
dec rcx
jnz back1
mov [ans],ax
dispmsg hmsg, hmsg_len
mov ax,[ans]
call display_16
ret
accept_16:
accept buf,5
xor bx,bx
mov rcx,4
mov rsi,buf
next_digit: shl bx,04
mov al,[rsi]
cmp al,39h
jbe sub30
sub al,7h
sub30: sub al,30h
add bx,ax
inc rsi
loop next_digit
ret
display_16:
mov rsi,char_ans+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 [rsi],dl
dec rsi
dec rcx
jnz cnt
dispmsg char_ans,4
ret
No comments:
Post a Comment