【发布时间】:2014-12-01 02:45:02
【问题描述】:
我正在尝试从一个文件中读取多个字符串并将它们全部存储在一起。输入的设计方式,保证以下前提:
- 我必须读入的字符串数量是预先确定的
- 所有字符串(包括换行符和 NUL 字节)的长度相同
我有以下代码,但是我在第二次进入循环时遇到了未对齐的内存字引用错误。
.data
.align 4
aLine:
.space 128
arr:
.space 1024
.text
//...
//...
build:
addi $sp,$sp,-24
sw $ra, 20($sp)
sw $s4, 16($sp)
sw $s3, 12($sp)
sw $s2, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)
li $t0,0 #incrementing value for index
move $s0,$a0 #$a0 is the number of strings
addi $s1,$a1,2 #$a1 is the length of each string, $s1 makes room for the newline character and the null
la $a2,arr
build_loop:
beq $t0,$s0,build_done
li $v0, READ_STRING #READ_STRING is set to 8 earlier in the program
la $a0,aLine
move $a1,$s1
syscall
mul $t1,$t0,$s1
add $t2,$t1,$a2
sw $v0,($t2)
addi $t0,$t0,1
jal build_loop
build_done:
lw $ra, 20($sp)
lw $s4, 16($sp)
lw $s3, 12($sp)
lw $s2, 8($sp)
lw $s1, 4($sp)
lw $s0, 0($sp)
addi $sp,$sp,24
jr $ra
我主要从 online resource 创建整数数组,调整值以使用恒定长度的字符串。
我到底错过了什么?
【问题讨论】:
-
“我在创建整数数组时得到了这个……” - 整数和指针的对齐要求有时不同。
-
我意识到这一点。我以为我做了正确的调整,但显然不是。而且我一直盯着它看太久了,无法用健全的头脑弄清楚。
-
作为一个快速测试,您可以尝试将
align 4添加到 *.S 文件中。例如,参见Assembly HowTo。 -
不。似乎仍然遇到同样的问题。问题似乎发生在 store word 指令中,如果它提供了任何必要的信息(这再次发生在 $t0 增加到 1 之后)
-
我们需要查看相关的数据声明。如果
$t0 += 1导致SIGBUS,那么您可能需要对齐数组成员。尝试分配足够的空间来容纳对齐的数组,然后使用$t0 += 2或$t0 += 4。
标签: arrays string assembly mips