2016-10-11 3 views
1

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.

Antwort

1

Ich vermute es liegt an etwas in der Richtung von Speicheradressen, die zusammenstoßen, weil die Zeichenfolge so lang ist.

Nein, es ist, weil Sie versuchen, ein Wort (4 Bytes) von einer nicht wortausgerichtete Adresse (0x10010027) zu laden.
lw und sw sind die falschen Anweisungen hier zu verwenden, da Ihre Zeichen Bytes, keine Wörter sind. Sie sollten also lb (oder lbu) und sb using verwenden.

+0

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

+0

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

Verwandte Themen