Prac4
Prac4
04
Name:- Swapnil
Suryavanshi
Roll No:- S213074
Div:- C
Batch:- C2
Problem Statement:-
Write a switch case driven X86/64 ALP to perform 64-bit hexadecimal arithmetic
operations (+,-,*, /) using suitable macros. Define procedure for each operation.
Program:-
%macro IO 4
mov rax, %1
mov rdi, %2
mov rsi, %3
mov rdx, %4
syscall
%endmacro
section .data
menu db "Enter Choice (+, -, *, /): ",10
menu_len equ $ - menu
newline db 10
invalid db "Invalid Choice!",10
invalid_len equ $ - invalid
section .bss
choice resb 2
num1 resb 20
num2 resb 20
result resb 20
section .text
global _start
_start:
; Show menu and get user choice
IO 1, 1, menu, menu_len
IO 0, 0, choice, 2
; Invalid choice
IO 1, 1, invalid, invalid_len
jmp exit
do_add:
mov rax, r8
add rax, r9
mov rsi, result
call int_to_str
IO 1, 1, msg_add, 18
IO 1, 1, result, 20
IO 1, 1, newline, 1
jmp exit
do_sub:
mov rax, r8
sub rax, r9
mov rsi, result
call int_to_str
IO 1, 1, msg_sub, 20
IO 1, 1, result, 20
IO 1, 1, newline, 1
jmp exit
do_mul:
mov rax, r8
imul rax, r9
mov rsi, result
call int_to_str
IO 1, 1, msg_mul, 23
IO 1, 1, result, 20
IO 1, 1, newline, 1
jmp exit
do_div:
mov rax, r8
xor rdx, rdx
mov rbx, r9
div rbx ; rax = quotient, rdx = remainder
; print remainder
mov rsi, result
mov rax, rdx
call int_to_str
IO 1, 1, msg_div_r, 10
IO 1, 1, result, 20
IO 1, 1, newline, 1
; print quotient
mov rsi, result
mov rax, r8
xor rdx, rdx
div r9
call int_to_str
IO 1, 1, msg_div_q, 9
IO 1, 1, result, 20
IO 1, 1, newline, 1
jmp exit
exit:
mov rax, 60
xor rdi, rdi
syscall
;
; Convert ASCII string to int
; rsi -> address of string
; returns result in rax
str_to_int:
xor rax, rax
xor rcx, rcx
.next_digit:
mov bl, [rsi + rcx]
cmp bl, 10
je .done
cmp bl, 0
je .done
cmp bl, '0'
jb .done
cmp bl, '9'
ja .done
sub bl, '0'
imul rax, rax, 10
add rax, rbx
inc rcx
jmp .next_digit
.done:
ret
;
; Convert int in rax to ASCII string
; rsi -> output buffer
; rax -> input number
int_to_str:
mov rcx, 0
mov rbx, 10
.next:
xor rdx, rdx
div rbx
add dl, '0'
push rdx
inc rcx
test rax, rax
jnz .next
; pop to buffer
.rev:
pop rax
mov [rsi], al
inc rsi
loop .rev
mov byte [rsi], 0
ret
Output:-