OneCompiler

Assignment 8

102

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 menuhbMsgdb10,"HEXtoBCD"db10,"EnterMaximum4DigitsHEXNumber:"hbMsgLenequ- menu hbMsg db 10,"HEX to BCD" db 10,"Enter Maximum 4 Digits HEX Number : " hbMsgLen equ - hbMsg
bmsg db "Equivalent BCD : "
bmsgLen equ bmsgbhMsgdb10,"BCDtoHEX"db10,"EnterMaximum5DigitsBCDNumber:"bhMsgLenequ- bmsg bhMsg db 10,"BCD to HEX" db 10,"Enter Maximum 5 Digits BCD Number : " bhMsgLen equ - bhMsg
hmsg db "Equivalent HEX : "
hmsgLen equ hmsgnewlinedb10,13newlineLenequ- hmsg newline db 10,13 newlineLen 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