如何访问加载到数据段中的长字符串?

时间:2016-10-11 20:09:38

标签: string mips memory-address mips32

我开始编写一个MIPS程序,它从数据段中获取一个输入字符串,使用字符映射对其进行编码,该字符映射也是数据部分中加载的字符串,然后将编码后的字符串写入必须输出的字符串中也可以保存在内存中,以免输入字符串被覆盖。所有字母都编码为大写,所有空格,标点符号等在编码过程中被删除,所有字符串必须用换行符分隔。

到目前为止,这是我的计划的开始:

        .data
DataIn:     .ascii  "Test String\n"
SubMap:     .ascii  "PHQGIUMEAYLNOFDXJKRCVSTZWB\n"
DataOut:    .ascii  ""

        .text
        .globl  main

main:   
        la  $a0, DataIn     #a0 = &DataIn[0]
        la  $a1, DataOut    #a1 = &DataOut[0]
        la  $a2, SubMap     #a2 = &SubMap[0]
        jal subCipher
        syscall 

subCipher:
        lw  $t0, 0($a0)     #t0 = DataIn[0]  (first char of input)
        lw  $t1, 0($a1)     #t1 = DataOut[0] (first char of output)

执行时,我在最后一行收到错误:lw $t1, 0($a1)。引发的错误是

Runtime exception at 0x00400024: fetch address not aligned on word boundary 0x10010027

我猜这是由于内存地址冲突的原因,因为SubMap字符串太长而且存储在DataOut字符串之前。我该如何解决这个问题?

在第二个注释中,如何在编码字符串创建时将其存储在内存中,以便不覆盖输入字符串。目前,我只是在数据段中加载一个空字符串,但我认为这不会起作用。

1 个答案:

答案 0 :(得分:1)

  

我猜这是由于内存地址冲突的原因,因为字符串很长。

不,这是因为你试图从非字对齐的地址(0x10010027)加载一个字(4个字节)。
lwsw是在这里使用的错误指令,因为您的字符是字节,而不是单词。因此,您应该使用lb(或lbu)和sb