【问题标题】:How can I access a long string loaded into the data segment?如何访问加载到数据段中的长字符串?
【发布时间】:2016-10-11 20:09:38
【问题描述】:

我开始编写一个 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

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

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

【问题讨论】:

    标签: string mips memory-address mips32


    【解决方案1】:

    我猜这是由于字符串太长而导致内存地址冲突。

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

    【讨论】:

    • 好吧,有道理好吧!谢谢你。关于在每个字母编码时将我的编码字符串写入内存,我可以将第一个字母写到DataOut的地址,然后在下一个单词偏移处写下一个字母等等?
    • 是的,但是您确实应该为编码字符串保留足够的空间。要么使用.space 指令静态地使用,要么使用系统调用9 动态地使用(假设SPIM/MARS)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多