Assignment 10
section .data
msg1 db "Enter Multiplicand : "
len1 equ - msg2
menu db 10,"1)Successive Addition."
db 10,"2)Add & Shift."
db 10,"3)Exit."
db 10,"Enter Your Choice : "
menuLen 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