2016-10-11 3 views
1

Я начинаю писать программу 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

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

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

+0

Хорошо, имеет смысл в порядке! Спасибо. И что касается записи моей закодированной строки в память по мере кодирования каждой буквы, могу ли я просто написать первую букву в адрес «DataOut», затем следующую букву при смещении следующего слова и так далее? – KOB

+0

Да, но вы действительно должны зарезервировать достаточно места для закодированной строки. Либо статически с директивой '.space', либо динамически используя системный вызов 9 (предполагая SPIM/MARS). – Michael