【问题标题】:Unaligned memory reference when reading and storing multiple strings读取和存储多个字符串时未对齐的内存引用
【发布时间】:2014-12-01 02:45:02
【问题描述】:

我正在尝试从一个文件中读取多个字符串并将它们全部存储在一起。输入的设计方式,保证以下前提:

  1. 我必须读入的字符串数量是预先确定的
  2. 所有字符串(包括换行符和 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


【解决方案1】:

您正在使用jal build_loop,它实际上是递归,而不是迭代。
不幸的是,jal build_loop 将返回地址存储到寄存器(加载存储架构,还记得吗?)恰好是 @987654323 @ (GPR 31)。这与build_loop 的其余部分发生了严重冲突,后者忽略了将$ra 保存在堆栈中。
结果当然是$ra 被破坏了。

【讨论】:

  • 当你说我遗漏了一些东西时,我突然想到了,包括将$ra 存储和加载到堆栈中和从堆栈中加载。现在已经包括在内了。我的错。
  • 您发布的代码仍然没有意义:$ra 未保存build_loop:jal built_loop 之间。你确实意识到 MIPS 比 jal 有更多的分支/跳转指令,对吧?
  • 好吧,我只是尝试将其更改为像b 这样简单的东西,但不幸的是同时发生了同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2011-05-14
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多