Any help will be greatly appreciated. thanks! Implement a simple four function c
ID: 3813164 • Letter: A
Question
Any help will be greatly appreciated. thanks!
Implement a simple four function calculator in the LC3 assembly language that will run on the LC-3 simulator. You will use these subroutines to implement the calculator. The inputs to the calculator will not exceed 4 digits. This is to avoid overflow since the range of numbers handled by the 16-bit LC-3 is [-32768: +32767] The user interaction with the calculator is shown below: LS-3 Calculator Operation (+, -, *, /)? + Enter the first operand (SRC1): 34 Enter the second operand (SRC2): 27 Sum is: 61 Continue (Y, N)? Y Operation (+, -, *, /)? Enter the first operand (SRC1): 378 Enter the second operand (SRC2): 237 Enter the Operator (+, -, *, /): - Difference is:141 Continue (Y, N)? Y Operation (+, -, *, /)? - Enter the first operand (SRC1):34 Enter the second operand (SRC 2): 75.Explanation / Answer
.data
# const string for welcome
welc: .asciiz "Welcome to SPIM Calculator one.0! "
p_int: .asciiz " Please offer associate integer: "
p_op: .asciiz " Please offer associate operator: "
i_err: .asciiz " Input Incorrect, unhealthy operator! "
again_str: .asciiz "Another calculation? (y/n)"
rmndr: .asciiz " r: "
new_line: .asciiz " "
int1: .word one # house to carry int one
int2: .word one # house to carry int a pair of
raw_in: .space one # house to carry raw input
op: .space one # house to carry operator char
a_char: .space one # house to carry once more char
out: .word one # house to carry output
remain: .word one # house to carry remainder
#operator constants
c_plus: .ascii "+" # const for +
c_min: .asciiz "-" # const for -
c_mult: .asciiz "*" # const for *
c_divi: .asciiz "/" # const for /
c_eq: .asciiz "=" # const for =
c_no: .asciiz "n" # const for n
.text
.globl main
main: li $v0, four # syscall four, print string
la $a0, welc # offer argument: string
syscall # really print string
calc: la $t6, stay # load remainder variable
move $t6, $zero # store zero in remainder (reset)
li $v0, four # syscall four, print string
la $a0, purpose # offer argument: string
syscall # really print string
li $v0, five # tell syscall we would like to scan int one
syscall # really scan in int one
la $s1, int1 # load int1 into $s1
move $s1, $v0 # copy the number from $v0 to int1
li $v0, four # syscall four, print string
la $a0, purpose # offer argument: string
syscall # really print string
li $v0, five # tell syscall we would like to scan int a pair of
syscall # really scan in int a pair of
la $s2, int2 # offer $s2 the address to carry int a pair of
move $s2, $v0 # copy the number from $v0 to $s2
li $v0, four # syscall four, print string
la $a0, p_op # offer argument: string
syscall # really print string
li $v0, eight # tell syscall we would like to scan operator
la $a0, op # offer $a0 the address to carry the operator
syscall # really scan in operator
lb $t0, op # load the primary computer memory unit of op
li $t1, '+' # load const for and
li $t2, '-' # load const for minus
li $t3, '*' # load const for multiplying
li $t4, '/' # load const for dividing
la $s0, out # load bent $s0
beq $t0, $t1, and # we're adding
beq $t0, $t2, minus # we're subtracting
beq $t0, $t3, multi # we're multiplying
beq $t0, $t4, divi # we're dividing
# else
j error # incorrect input
plus: add $s0, $s1, $s2 # add our ints, store in $t0
j print
minus: sub $s0, $s1, $s2 # compute our ints, store in $t0
j print
multi: slt $t1, $t2, $s2 # if our counter is a smaller amount than int2, set $t1 to one
beq $t1, $zero, print # if we've reached int2, we're done
add $s0, $s1, $s1 # add int1 and int1, store in out
j multi # loop
divi: la $t0 stay # load remainder into $t0
move $t0, $s1 # set remainder to dividend
add $s0, $zero, $zero # commenced to zero, simply just in case
loop: slt $t1, $t0, $s2 # if remainder is a smaller amount than divisor, set 1
beq $t1, $zero, print # if we're done branch to done
sub $t0, $t0, $s2 # sub divisor from remainder, store in remainder
addi $s0, $s0, one # increment quotient by one
j loop # loop
print: li $v0, one # tell syscall we would like to print int
la $a0, int1 # offer syscall int1 to print
syscall # really print int
li $v0, four # tell syscall we would like to print string
lb $a0, op # tell syscall we would like to print operator
syscall # really print string
li $v0, one # tell syscall we would like to print int
la $a0, int2 # offer syscall int2 to print
syscall # really print int
li $v0, four # tell syscall we would like to print string
la $a0, c_eq # tell syscall we would like to print operator
syscall # really print string
li $v0, one # tell syscall we would like to print number
la $a0, out # offer syscall our output
syscall # really print int
la $t0, stay # load remainder
beq $t0, $zero, once more # if we've no remainder, end printing
li $v0, four # tell syscall we would like to print string
la $a0, rmndr # tell syscall we would like to print remainder string
syscall # print "r: "
li $v0, one # tell syscall we would like to print int
la $a0, stay # offer syscall our remainder to print
syscall # print remainder
again: li $v0, four # tell syscall we would like to print string
la $a0, printing operation # tell syscall to print printing operation
syscall
la $a0, once more_str # load prompt for again string for syscall
syscall
li $v0, eight # tell syscall we would like to scan string
la $a0, a_char # tell syscall to place it in $a0
syscall
lb $t0, a_char
li $t1, 'n' # get n char therefore we will compare
beq $t0, $t1, exit # if we have a tendency to square measure done, exit
#else loop
j calc # jump to starting
error: li $v0, four # tell syscall we would like to print string
la $a0, i_err # offer syscall what to print
syscall # really print
j once more # head to prompt for rehear
exit: li $v0, ten # exit code
syscall #exit!
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.