如何访问加载到数据段中的长字符串?
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 个字节)。
lw
和 sw
是此处使用的错误说明,因为您的字符是字节,而不是单词。所以你应该使用 lb
(或 lbu
)和 sb
.
我开始编写一个 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 个字节)。
lw
和 sw
是此处使用的错误说明,因为您的字符是字节,而不是单词。所以你应该使用 lb
(或 lbu
)和 sb
.