Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

% macro print 2 mov rax, 1 ;SYS _ write mov rdi, 1 ;standard output device mov rsi, % 1 ;output string address mov rdx

%macro print 2
mov rax, 1 ;SYS_write
mov rdi, 1 ;standard output device
mov rsi, %1 ;output string address
mov rdx,%2 ;number of character
syscall ;calling system services
%endmacro
%macro scan 2
mov rax, 0 ;SYS_read
mov rdi, 0 ;standard input device
mov rsi, %1 ;input buffer address
mov rdx,%2 ;number of character
syscall ;calling system services
%endmacro
section .bss
buffer resb 10 ; Input buffer for the arithmetic expression
result resb 1 ; Result of the calculation
ascii resb 10 ; Buffer for the ASCII representation of the result
section .data
LF equ 10
NULL equ 0
input_msg db "Enter arithmetic expression (e.g., a+b*c-d/e): ",0
input_msg_len equ $ - input_msg
result_msg db "Result: ",0
result_msg_len equ $ - result_msg
section .text
global _start
_start:
; Prompt user for input
print input_msg, input_msg_len
; Read input arithmetic expression
scan buffer, 10
; Calculate the result
mov rdi, buffer ; Pass the input buffer address
call calculate
; Convert result to string
mov rdi, result ; Pass the address of the result
mov rsi, ascii ; Pass the address of the buffer for ASCII representation
call toString
; Display the result
print result_msg, result_msg_len
print ascii, 10 ; Print the ASCII representation of the result with newline
; Terminate the program
mov rax, 60
xor rdi, rdi
syscall
calculate:
; Save the original value of rcx
push rcx
; Initialize variables
mov rcx,0 ; Loop counter
mov byte[result],0 ; Initialize result to 0
calc_loop:
; Read the current character from input buffer
mov al, byte[rdi + rcx]
; Check if the character is a digit
cmp al,'0'
jb done_calc ; If not a digit, exit loop
cmp al,'9'
ja done_calc ; If not a digit, exit loop
; Convert ASCII digit to integer
sub al,'0'
; Update result based on the operation
; You can add more operations here
; For example: +,-,*,/
; Assume that the input format is always digit - operator - digit
; Example: a+b*c-d/e
; Perform left-to-right evaluation without considering operator precedence
; Check if there's an operator after the digit
cmp byte[rdi + rcx +1],'+'
je add_operation
cmp byte[rdi + rcx +1],'-'
je subtract_operation
cmp byte[rdi + rcx +1],'*'
je multiply_operation
cmp byte[rdi + rcx +1],'/'
je divide_operation
; If no operator found, move to the next character
inc rcx
jmp calc_loop
add_operation:
; Read the next digit
mov al, byte[rdi + rcx +2]
sub al,'0'
; Add the next digit to the result
add byte[result], al
; Move to the next operator
add rcx,3
jmp calc_loop
subtract_operation:
; Read the next digit
mov al, byte[rdi + rcx +2]
sub al,'0'
; Subtract the next digit from the result
sub byte[result], al
; Move to the next operator
add rcx,3
jmp calc_loop
multiply_operation:
; Read the next digit
mov al, byte[rdi + rcx +2]
sub al,'0'
; Multiply the result by the next digit
mul byte[result]
mov byte[result], al
; Move to the next operator
add rcx,3
jmp calc_loop
divide_operation:
; Read the next digit
mov al, byte[rdi + rcx +2]
sub al,'0'
; Check if the next digit is zero to avoid division by zero
cmp al,0
je done_calc
; Divide the result by the next digit
mov ah,0
mov bl, byte[result]
div bl
mov byte[result], al
; Move to the next operator
add rcx,3
jmp calc_loop
done_calc:
; Restore the original value of rcx
pop rcx
ret
; Integer to String function
toString:
; Part A - Successive division
movzx eax, byte[rdi] ; Get integer
mov rcx,0 ; digitCount =0
mov ebx, 10 ; Set for dividing by 10
divideLoop:
mov edx, 0
div ebx ; Divide number by 10
push dx ; Push remainder
inc rcx ; Increment digitCount
cmp eax, 0 ; If quotient !=0
jne divideLoop ; Goto divideLoop
; Part B - Convert remainders and store
mov rbx, rsi ; Get addr of ascii
mov rdi, 0 ; rdi =0
popLoop:
pop rax ; Pop intDigit
add al,"0"
image text in transcribed

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Database Design And Implementation

Authors: Shouhong Wang, Hai Wang

1st Edition

1612330150, 978-1612330150

More Books

Students also viewed these Databases questions

Question

2. Are you varying your pitch (to avoid being monotonous)?

Answered: 1 week ago

Question

3. Are you varying your speaking rate and volume?

Answered: 1 week ago