Arrays PC=0x004000a8时发生异常->;(之后中止)——>;在inst/data fetch中后跟未对齐的地址:0x1001012b
我正在尝试在程序集中重新创建C代码段。C程序本质上是:Arrays PC=0x004000a8时发生异常->;(之后中止)——>;在inst/data fetch中后跟未对齐的地址:0x1001012b,arrays,mips,memory-address,memory-alignment,qtspim,Arrays,Mips,Memory Address,Memory Alignment,Qtspim,我正在尝试在程序集中重新创建C代码段。C程序本质上是: 创建一个字符数组[256]以及一个初始化为NULL的指针*a 然后,用户输入的某些字符串被存储到char数组中 而数组的每个第i个元素!=0 检查它,第i个元素是==某个定义的字符值V 如果数组[i]==V->set A=&array[i] 中断 最后检查A是否仍然初始化为NULL 如果不是pint,则为A的地址和值 否则找不到 不幸的是,当我使用Qtspim运行MIPS代码时,我发现前面提到的错误异常发生在PC=0x004000a8
- 创建一个字符数组[256]以及一个初始化为NULL的指针*a
- 然后,用户输入的某些字符串被存储到char数组中
- 而数组的每个第i个元素!=0
- 检查它,第i个元素是==某个定义的字符值V
- 如果数组[i]==V->set A=&array[i]
- 中断
- 最后检查A是否仍然初始化为NULL 如果不是pint,则为A的地址和值
- 否则找不到
Qtspim
运行MIPS代码时,我发现前面提到的错误异常发生在PC=0x004000a8
->(之后中止)
->在inst/data fetch中后跟未对齐的地址:0x1001012b
我觉得这与我在数组中存储字节值的方式或访问这些内存位置的方式有关,但我不知道问题出在哪里。任何人如能提供任何见解,将不胜感激。祝大家节日快乐
下面是我的汇编代码:
# global functions aforementioned error
.globl main
# .text assembler directive
.text
# main
main:
# register map
# use $t0 for i
# use $t1 for NULL
# use $s0 for &inputArray[i]
# use $s1 for indexed array value
# use $s2 for the base address inputArray
# use $s3 for result
# use $t2 for constCharlwr
# Prompt user for input
la $a0, str1
li $v0, 4
syscall
# Get user input and store in input array
la $a0, inputArray
li $a1, 256
li $v0, 8
syscall
# set up registers
lb $t0, i
lb $t1, NULL
la $s2, inputArray
lb $s3, result
lb $t2, constCharlwr
li $s0, 0
add $s0, $s0, $s2 # s0 = &arrayA[i]
while: # while loop
add $s0, $s0, $t0 # base address + 1 byte
lb $s1, 0($s0) # load array index value into s1
beq $s1, $t1, outsideWhile # inputArray[i] != '\0'
if1:
bne $s1, $t2, outsideIf # check if inputArray[i] == e
move $s3, $s1 # if true copy s1(inputArray[i] into s3(result)
sb $s3, result
j outsideWhile
outsideIf:
addi $t0, $t0, 1
j while
outsideWhile:
if2:
beq $s3, $t1, else
# Print results
# Print string 2
lw $a0, str2
li $v0, 4
syscall
# Print address of result
la $a0, result
li $v0, 4
syscall
# Print next line
lb $a0, nextline
li $v0, 4
syscall
# Print string 3
lw $a0, str3
li $v0, 4
syscall
# Print result char value
lb $a0, result
li $v0, 4
syscall
# Print next line
lb $a0, nextline
li $v0, 4
syscall
j exitPrgm
else:
# Print No match
lw $a0, str4
li $v0, 4
syscall
# Exit the program by means of syscall.
exitPrgm:
li $v0, 10 # Sets $v0 to "10" to select exit syscall
syscall # Exit
# .data assembler directive
.data
inputArray: .space 256
constCharlwr: .byte 'e'
result: .byte 0
NULL: .byte 0
i: .byte 0
str1: .asciiz "Enter a word to search for letter e: \n"
str2: .asciiz "First match at address "
str3: .asciiz "The matching character is "
str4: .asciiz "No match found\n"
nextline: .asciiz "\n"
好的,我解决了我最初的问题,我没有使用la进行系统调用,一旦我修复了,我就开始得到我想要的输出。现在唯一的问题是我能想出如何打印结果的实际地址。有人能帮我吗。 新代码,尝试了一些不同的方法来获取内存地址,但似乎没有任何效果
# Prompt user for input
la $a0, str1
li $v0, 4
syscall
# Get user input and store in input array
la $a0, inputArray
li $a1, 255
li $v0, 8
syscall
# set up registers
lb $t0, i
lb $t1, NULL
la $s2, inputArray
lb $s3, result
lb $t2, constCharlwr
li $s0, 0
add $s0, $s0, $s2 # s0 = &arrayA[i]
while: # while loop
add $s0, $s0, $t0 # base address + 1 byte
lb $s1, 0($s0) # load array index value into s1
beq $s1, $t1, outsideWhile # inputArray[i] != '\0'
if1:
bne $s1, $t2, outsideIf # check if inputArray[i] == e
sb $s1, result
j outsideWhile
outsideIf:
addi $t0, $t0, 1
j while
outsideWhile:
if2:
beq $s1, $t1, else
# Print results
# Print string 2
la $a0, str2
li $v0, 4
syscall
# Print address of result
la $t9, result
li $t8, 4
li $t0, 0
#for:
# bge $t0, $t8 outsideFor
# add $t9, $t9, $t0
# lb $t7, 0($t9)
# sb $t7, resultAddr
# la $a0, resultAddr
# li $v0, 4
# syscall
# addi $t0, $t0, 1
# j for
#outsideFor:
sb 0($t9) resultAddr
la $a0, resultAddr
li $v0, 4
syscall
sb 1($t9) resultAddr
la $a0, resultAddr
li $v0, 4
syscall
sb 2($t9) resultAddr
la $a0, resultAddr
li $v0, 4
syscall
sb 3($t9) resultAddr
la $a0, resultAddr
li $v0, 4
syscall
# Print next line
la $a0, nextline
li $v0, 4
syscall
# Print string 3
la $a0, str3
li $v0, 4
syscall
# Print result char value
la $a0, result
li $v0, 4
syscall
# Print next line
la $a0, nextline
li $v0, 4
syscall
j exitPrgm
else:
# Print No match
la $a0, str4
li $v0, 4
syscall