OneCompiler

Assignment 10

125

section .data
msg1 db "Enter Multiplicand : "
len1 equ msg1msg2db"EnterMultiplier:"len2equ- msg1 msg2 db "Enter Multiplier : " len2 equ - msg2
menu db 10,"1)Successive Addition."
db 10,"2)Add & Shift."
db 10,"3)Exit."
db 10,"Enter Your Choice : "
menuLen equ menuemsgdb"InvalidChoice"emsgLenequ- menu emsg db "Invalid Choice" emsgLen equ - emsg
resultH dw 0000000000000000h
newline db 10
msg3 db 10,"Result :"
len3 equ $ - msg3

section .bss
multiplicandH resb 3
multiplicandA resb 1
multiplierH resb 3
multiplierA resb 1
choice resb 2
avar resb 4
var resb 2
count resb 1
resultA resb 4
mulcopy resb 1

%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

section .text
global _start
_start:
up:
print msg1, len1
read multiplicandA, 3
print msg2, len2
read multiplierA, 3
mov ax, word[multiplicandA]

	mov word[avar], ax
	call packnum1
	mov al, byte[var]
	mov byte[multiplicandH], al
	
	mov ax, word[multiplierA]
	
	mov word[avar], ax
	call packnum1
	mov al, byte[var]
	mov byte[multiplierH], al
	
l1:
	print menu, menuLen
	read choice, 2
	cmp byte[choice], 31h
	je case1
	cmp byte[choice], 32h
	je case2
	cmp byte[choice], 33h
	je exit
	print emsg, emsgLen
	jmp l1
case1:
	mov al, byte[multiplierH]
	mov byte[count], al
	bac:
		mov edx, 0h
		mov dl, byte[multiplicandH]
		add word[resultH], dx
		dec byte[count]
		jnz bac
	jmp printresult
case2:
	mov al, byte[multiplierH]
	mov byte[mulcopy], al
	mov byte[count], 8
	back1:
		shl word[resultH], 01
		shl byte[mulcopy], 01
		jnc s1
		xor ax, ax
		mov al, byte[multiplicandH]
		add word[resultH], ax
	s1:
		dec byte[count]
		jnz back1
		
printresult:
	print msg3, len3
	mov ax, word[resultH]
	mov word[var], ax
	call asciiConv
	mov eax, dword[avar]
	mov dword[resultA], eax
	print resultA, 4
	print newline, 1

exit: 
	mov rax, 60
	mov rdi, 00
	syscall
	
packnum1:
	mov rsi, avar
	mov ebx, 0
	mov byte[count], 2
	mov eax, 0
	back11:
		mov al, [rsi]
		rol bl, 4
		cmp al, 39h
		jbe sub30
		sub al, 07h
	sub30:
		sub al, 30h
		or bl, al
		inc rsi
		dec byte[count]
		jnz back11
		mov byte[var],bl
	ret
	
asciiConv:
	mov r8, avar
	mov byte[count], 4
	mov ax, [var]
	back:
		rol ax, 04h
		mov bl, al
		and bl, 0Fh
		cmp bl, 09h
		jbe add30
		add bl, 07h
	add30:
		add bl, 30h
		mov [r8], bl
		inc r8
		dec byte[count]
		jnz back
	ret