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

How can I access a long string loaded into the data segment?

我开始编写一个 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 字符串之前。我该如何解决?

关于第二个问题,我如何在创建编码字符串时将其存储在内存中,以便不覆盖输入字符串。目前,我只是将一个空字符串加载到数据段中,但我认为这行不通。

I am guessing it is due to something along the lines of memory addresses clashing because the string is so long.

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