I am working on a MIPS morse code to ascii and ascii to morse converter. I was given the ascii to morse and I am working on the other way now.
I encountered this error after trying to come up with a loop to make it parse through the values. (we use spim to run this)
Exception occurred at PC=0x00400174 Unaligned address in inst/data fetch: 0x100100cb Exception 4 [Address error in inst/data fetch] occurred and ignored
Below is my code and I marked where my code is between the comment lines. I would like some help to figure out what the error is talking about as I don't understand this kind of error. I know that it is coming from the loopMC2A.
.data
string0: .asciiz "Select Operation Mode [0=ASCII to MC, 1=MC to ASCII]:"
string1: .asciiz "Enter a Character: "
string2: .asciiz "Enter a Pattern: "
string3: .asciiz "Morse Code: "
string4: .asciiz "ASCII: "
string5: .asciiz "End of Program\n"
string6: .asciiz "[Error] no ASCII2MC!\n"
string7: .asciiz "[Error] no MC2ASCII!\n"
string8: .asciiz "[Error] Invalid combination!\n"
buffer: .space 6
endLine: .asciiz "\n"
dict: .word 0x55700030, 0x95700031, 0xA5700032, 0xA9700033, 0xAA700034, 0xAAB00035, 0x6AB00036, 0x5AB00037, 0x56B00038, 0x55B00039, 0x9C000041, 0x6AC00042, 0x66C00043, 0x6B000044, 0xB0000045, 0xA6C00046, 0x5B000047, 0xAAC00048, 0xAC000049, 0x95C0004A, 0x6700004B, 0x9AC0004C, 0x5C00004D, 0x6C00004E, 0x5700004F, 0x96C00050, 0x59C00051, 0x9B000052, 0xAB000053, 0x70000054, 0xA7000055, 0xA9C00056, 0x97000057, 0x69C00058, 0x65C00059, 0x5AC0005A
s_dsh: .byte '-'
s_dot: .byte '.'
s_spc: .byte ' '
.text
main:
li $v0, 4 # print "Select Operation Mode [0=ASCII to MC, 1=MC to ASCII]:"
la $a0, string0
syscall # syscall print string0
li $v0, 5
syscall # syscall Read int
bne $v0, $0, MC2A
A2MC:
li $v0, 4 # print "Enter a Letter:"
la $a0, string1
syscall # syscall print string1
li $t0, 1 # Define length
li $v0, 12 # Read character
syscall # syscall Read character
move $t0,$v0 # Transfer the char entered to the temporary value
li $t2, 1 # Define length
li $v0, 12 # Read NULL character
syscall # syscall Read character
la $t2, dict # Load address of dir
li $t3, 0 # Initialize index
li $t4, 36 # Initialize boundary
LoopA2MC:
lb $t5, ($t2) # Load value to be compared
beq $t0, $t5, FndA2MC # Compare values
addi $t2, $t2, 4 # Next symbol
addi $t3, $t3, 1 # Next index
blt $t3, $t4, LoopA2MC # Evaluate index condition
j ErrorA2MC
FndA2MC:
li $v0, 4 # print "Enter a Letter:"
la $a0, string3
syscall # syscall print string3
lw $t3, ($t2) # Load value to be printed
li $t4, 0x80000000 # Load bitmask
snext:
and $t5, $t3, $t4 # Apply bitmask
beq $t5, $0, caseZ # Zero Found
caseO:
sll $t3, $t3, 1 # Shift Left
and $t5, $t3, $t4 # Apply bitmask
sll $t3, $t3, 1 # Shift Left
beq $t5, $0, pdot # 10 Found
caseE:
li $v0, 4 # Print string code
la $a0, endLine # Print NewLine
syscall # syscall print value
j EXIT # End
caseZ:
sll $t3, $t3, 1 # Shift Left
and $t5, $t3, $t4 # Apply bitmask
sll $t3, $t3, 1 # Shift Left
beq $t5, $0, caseN # 00 Found
pdash:
li $v0, 11 # Print char
lb $a0, s_dsh # Load value to be printed
syscall # Print value
j snext
pdot:
li $v0, 11 # Print char
lb $a0, s_dot # Load value to be printed
syscall # Print value
j snext
caseN:
li $v0, 4 # print "Error, Invalid combination!"
la $a0, string8
syscall # syscall print string
j EXIT
ErrorA2MC:
li $v0 , 4 # print "Error no ASCII2MC!"
la $a0 , string6
syscall # syscall print string6
j EXIT
MC2A:
li $v0 , 4 # print "Enter a Pattern:"
la $a0 , string2
syscall # syscall print string2
#--------------------------------------------------------------#
li $v0, 8 #load read string system call
la $a0, buffer #load address of buffer
la $a1, 6 #buffer size is 6
syscall
loopMC2A:
li $t0, 0 #load in initial value to t0
li $t1, 1 #load 00001 into t1 DOT BITS
li $t2, 2 #load 0010 into t2 DASH BITS
li $t3, 3 #load 0011 into t3 NULL TERMINATION BITS
la $s0, buffer #load string address
lw $s1, ($s0) #load character
lb $s2, s_dot
beq $s1, $s2, dotbit #compare to dot, then add 01
lb $s2, s_dsh
beq $s1, $s2, dashbit #compare to dash then add 10
lb $s2, s_spc
beq $s1, $s2, endbit #compare to space then add 11
j ErrorMC2A #if it wasn't one of those three it's an error
dotbit:#or with 01, shift left 2
or $t0, $t0, $t1 #or with 01 to write in a 01
sll $t0, $t0, 2 #shift left 2
addi $s0, $s0, 4 #move buffer over 4 bytes
j loopMC2A #back to loop
dashbit:
or $t0, $t0, $t2
sll $t0, $t0, 2 #shift left 2
addi $s0, $s0, 4 #move pointer over 4 bytes
j loopMC2A
endbit:
or $t0, $t0, $t3
j EXIT
li $v0, 4
la $a0, buffer #print buffer
syscall
#--------------------------------------------------------------#
FndMC2A:
li $v0 , 4 # print "Enter a Pattern:"
la $a0 , string4
syscall # syscall print string4
PrintMC2A:
li $v0 , 11
addiu $a0, $t0, 'A' -41
syscall
#--------------------------------------------------------------#
caseQ:
li $v0 , 4 # Print string code
la $a0 , endLine # Print NewLine
syscall # syscall print value
j EXIT # End
ErrorMC2A:
li $v0 , 4 # print "Error no MC2ASCII!"
la $a0 , string7
syscall # syscall print string7
j EXIT
EXIT:
li $v0, 4
la $a0, string5
syscall
li $a0, 0
li $v0, 17 #exit
syscall
User contributions licensed under CC BY-SA 3.0