Как я могу получить доступ к длинной строке, загруженной в сегмент данных?

Я начинаю писать программу 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. Как я могу решить эту проблему?

Во-вторых, как я могу хранить закодированную строку в памяти по мере ее создания, чтобы входная строка не перезаписывалась. В настоящее время я просто загружаю пустую строку в сегмент данных, но не думаю, что это сработает.


person KOB    schedule 11.10.2016    source источник


Ответы (1)


Я предполагаю, что это связано с конфликтом адресов памяти, потому что строка такая длинная.

Нет, это потому, что вы пытаетесь загрузить слово (4 байта) с адреса, не выровненного по слову (0x10010027).
lw и sw — неправильные инструкции для использования здесь, поскольку ваши символы — это байты, а не слова. Таким образом, вы должны использовать lb (или lbu) и sb.

person Michael    schedule 11.10.2016
comment
Ладно, логично! Спасибо. И что касается записи моей закодированной строки в память по мере кодирования каждой буквы, могу ли я просто записать первую букву по адресу DataOut, затем следующую букву по смещению следующего слова и так далее? - person KOB; 11.10.2016
comment
Да, но вам действительно следует зарезервировать достаточно места для закодированной строки. Либо статически с помощью директивы .space, либо динамически с помощью системного вызова 9 (при условии, что SPIM/MARS). - person Michael; 11.10.2016