Ich fange an, ein MIPS-Programm zu schreiben, das eine Eingabezeichenfolge aus dem Datensegment entnimmt, sie mit einer Zeichenmappe codiert, die ebenfalls eine Zeichenfolge im Datenteil ist, und dann die codierte Zeichenfolge in eine Ausgabestring schreibt, die ebenfalls muss im Speicher gehalten werden, damit die Eingabezeichenfolge nicht überschrieben wird. Alle Buchstaben werden in Großbuchstaben codiert, alle Leerzeichen, Interpunktionszeichen usw. werden während der Codierung entfernt und alle Zeichenfolgen müssen durch ein Zeilenumbruchzeichen getrennt werden. HierWie kann ich auf eine lange Zeichenfolge zugreifen, die in das Datensegment geladen wurde?
ist der Beginn meines Programms so weit:
.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)
Wenn er ausgeführt wird, erhalte ich einen Fehler in der letzten Zeile: lw $t1, 0($a1)
. Der Fehler geworfen ist
Runtime exception at 0x00400024: fetch address not aligned on word boundary 0x10010027
Ich vermute, bin es etwas entlang der Linien von Speicheradressen zurückzuführen ist clashing weil das SubMap
String so lang ist und vor dem DataOut
String gespeichert. Wie kann ich das beheben?
Auf eine zweite Notiz, wie kann ich die codierte Zeichenfolge in Arbeitsspeicher speichern, wie es erstellt wird, damit die Eingabezeichenfolge nicht überschrieben wird. Momentan lade ich nur eine leere Zeichenfolge in das Datensegment, aber ich glaube nicht, dass dies funktioniert.
Ok, macht Sinn in Ordnung! Vielen Dank. Und in Bezug auf das Schreiben meiner codierten Zeichenfolge in den Speicher, wie jeder Buchstabe codiert ist, kann ich nur den ersten Buchstaben an die Adresse von 'DataOut' schreiben, dann den nächsten Buchstaben beim nächsten Wort Offset und so weiter? – KOB
Ja, aber Sie sollten wirklich genügend Platz für die codierte Zeichenfolge reservieren. Entweder statisch mit der Anweisung '.space 'oder dynamisch mit Systemaufruf 9 (unter der Annahme von SPIM/MARS). – Michael