1 year ago
#360932
Rosie
Keep getting an exception 5 [address error in store] followed by unaligned address in store. How can I fix this?
My project requires me to enter an expression, convert it to postfix, and then be able to evaluate it. I got taking an input and converting it to an expression. However, while I'm trying push my integer into a stack in my evaluation procedure, I keep getting Exception 5 [address error in store]. I cannot figure out why it keeps giving me that exception. My assumption is that pushToStack2 is causing the issue.
.dataprompt1: .asciiz "Please enter an expression: "prompt2: .asciiz "\nThe expression you want to evaluate is "prompt3: .asciiz "\nThe postfix expression is "prompt4: .asciiz "\nThe evaluated answer is "userInput: .space 30postfixString: .space 30convertedString: .space 30
line: .asciiz "\n"
.text
.globl mainmain:#Calls input procedurejal input
#Calls postfix procedure
jal postfix
#Calls evaluate procedure
jal evaluation
#Calls output procedure
#jal output
#Ends program
li $v0, 10
syscall
#Procedure to get input from user and put it into a stringinput:#Print first promptli $v0, 4la $a0, prompt1syscall
#Get user input
li $v0, 8
la $a0, userInput
la $a1, 100
syscall
#Print second prompt
li $v0, 4
la $a0, prompt2
syscall
#Prints user input
li $v0, 4
la $a0, userInput
syscall
#Returns code back to the main procedure
jr $ra
#Procedure to change string from infix to postfixpostfix:
la $t0, userInput # $t0 = input
la $t3, postfixString # $t3 = postfix string
li $t1, 0 # increment i
lb $t2, 0($t0) # $t2 = character
while:
#Loops until counter equals null
beq $t2, $zero, endloop
#prints the character it is on in the string - testing only
#li $v0, 11
#move $a0, $t2
#syscall
#If character is '(', it will be pushed to stack
beq $t2, '(', pushToStack
#If character is an operand, it will add to postfix string
beq $t2, '0', addToPostfixStr
beq $t2, '1', addToPostfixStr
beq $t2, '2', addToPostfixStr
beq $t2, '3', addToPostfixStr
beq $t2, '4', addToPostfixStr
beq $t2, '5', addToPostfixStr
beq $t2, '6', addToPostfixStr
beq $t2, '7', addToPostfixStr
beq $t2, '8', addToPostfixStr
beq $t2, '9', addToPostfixStr
#If character is an operator, it will be pushed to stack
beq $t2, '+', pushToStack
beq $t2, '-', pushToStack
beq $t2, '*', pushToStack
beq $t2, '/', pushToStack
#If character is ')', it will be popped from stack
beq $t2, ')', popFromStack
#Procedure to push '(' or operator to the stack
pushToStack:
addi $sp, $sp, -1 #Points to next spot in stack -1 because it is a char
sb $t2, 0($sp) #Stores charater from $t2 to where stack pointer is pointing to
j endIteration
#Procedure to pop from the stack
popFromStack:
lb $t4, 0($sp) #Allocates space to store ')'
addi $sp, $sp, 1 #Moves to next slot in stack
move $t2, $t4 #Moves stored info from t4 to t2
lb $t4, 0($sp) #Allocates space to store ')'
addi $sp, $sp, 1 #Moves to next slot in stack
#Check if next is '(' or operator
beq $t2, '(', addToPostfixStr
beq $t2, '+', addToPostfixStr
beq $t2, '-', addToPostfixStr
beq $t2, '*', addToPostfixStr
beq $t2, '/', addToPostfixStr
j endIteration
#Procedure to add characters to the postfix string
addToPostfixStr:
sb $t2, 0($t3) #Saves operand or operator to the postfix string
addi $t3, $t3, 1 #Moves to the next slot in string
j endIteration
#Procedure to end the current iteration
endIteration:
addi $t0, $t0, 1 # $t0 = $t0 + 1
lb $t2 0($t0)
j while #loop backs to while procedure
endloop:
#Prints prompt 3
li $v0, 4
la $a0, prompt3
syscall
#Prints the expression after postfix
li $v0, 4
la $a0, postfixString
syscall
#Skips a line
li $v0, 4
la $a0, line
syscall
#Returns code back to the main procedure
jr $ra
evaluation:
#Skips a line
li $v0, 4
la $a0, line
syscall
#Loads the postfix string
la $t0, postfixString
#Prints the expression after postfix
li $v0, 4
move $a0, $t0
syscall
#Skips a line
li $v0, 4
la $a0, line
syscall
li $t1, 0 # increment i
lb $t2, 0($t0) # $t2 = character
while2:
#Loops until counter equals null
beq $t2, $zero, endloop2
#Prints the character from the postfix expression
#li $v0, 11
#move $a0, $t2
#syscall
#If the character is a number, it will send to the convertToInt procedure
beq $t2, '0', convertToInt
beq $t2, '1', convertToInt
beq $t2, '2', convertToInt
beq $t2, '3', convertToInt
beq $t2, '4', convertToInt
beq $t2, '5', convertToInt
beq $t2, '6', convertToInt
beq $t2, '7', convertToInt
beq $t2, '8', convertToInt
beq $t2, '9', convertToInt
#beq $t2, '+', popFromStack2
#beq $t2, '-', popFromStack2
j endIteration2
#Converts character to an integer
convertToInt:
addi $t7, $t2, -48 #Converted integer is now stored in $t4
#Skips a line
li $v0, 4
la $a0, line
syscall
#Prints the integer
li $v0, 1
move $a0, $t7
syscall
#Skips a line
li $v0, 4
la $a0, line
syscall
#Takes integer that is stored in $t4 and pushes it into stack
beq $t7, 0, pushToStack2
beq $t7, 1, pushToStack2
beq $t7, 2, pushToStack2
beq $t7, 3, pushToStack2
beq $t7, 4, pushToStack2
beq $t7, 5, pushToStack2
beq $t7, 6, pushToStack2
beq $t7, 7, pushToStack2
beq $t7, 8, pushToStack2
beq $t7, 9, pushToStack2
j endIteration2
pushToStack2:
addi $sp, $sp, -4 #Points to next spot in stack -4 beacuse it is an int
sw $t7, ($sp) #Stores integer from $t4 to where stack pointer is pointing to
#Prints the integer
#li $v0, 1
#move $a0, $sp
#syscall
j endIteration2
endIteration2:
addi $t0, $t0, 1 # $t0 = $t0 + 1
lb $t2, 0($t0)
j while2 #loop backs to while2 procedure
endloop2:
#Returns code back to the main procedure
jr $ra`
I looked around the internet and tried if .align would work but it didn't fix anything. I tried a different register in case it was already used prior.
assembly
mips
qtspim
spim
0 Answers
Your Answer