Я начинаю писать программу 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
строки. Как я могу это решить?
Во втором примечании, как сохранить закодированную строку в памяти по мере ее создания, чтобы строка ввода не была перезаписана. В настоящее время я просто загружаю пустую строку в сегмент данных, но я не думаю, что это сработает.
Хорошо, имеет смысл в порядке! Спасибо. И что касается записи моей закодированной строки в память по мере кодирования каждой буквы, могу ли я просто написать первую букву в адрес «DataOut», затем следующую букву при смещении следующего слова и так далее? – KOB
Да, но вы действительно должны зарезервировать достаточно места для закодированной строки. Либо статически с директивой '.space', либо динамически используя системный вызов 9 (предполагая SPIM/MARS). – Michael