2016-03-29 6 views
0

Ich schreibe ein Programm, das eine römische Zahl (bis zu 12 Zeichen) führt und wandelt es in einen Dezimalwert. Ich bin in der Lage, diese Konvertierung erfolgreich durchzuführen und jeden Wert Zeichen für Zeichen zu lesen, jedoch ist mein Wert immer 1000 größer als der tatsächliche, wenn die eingegebene Zeichenfolge nicht 12 Zeichen ist. Ich habe festgestellt, dass dies auf eine zusätzliche Schleife durch das Auswertungsunterprogramm zurückzuführen ist. Wenn keine Übereinstimmungen gemacht werden, tritt es in den Prozess zum Umwandeln von M = 1000 ein.Endzeichen von Benutzereingabestring

Ich gehe davon aus, es hat etwas mir den Benutzer Zeichenfolge, wenn weniger als 12 Zeichen Lese mit der Art und Weise zu tun. Es ist mein Verständnis, dass der Lesezeichensystem-Aufrufcode fortfährt, bis er ein '\ n'-Zeichen erreicht, und dieses Zeichen und den Rest seines leeren Speicherplatzes in 0 Zeichen konvertiert, so dass geprüft wird, ob das nächste Zeichen ungleich 0 funktioniert da ich nicht erwarte, dass 0 in der Benutzereingabe ist. Ich weiß, dass ich meinen Code reparieren kann, indem ich zu tailLoop spring, wenn bei "evaluate" keine Übereinstimmung gefunden wird, aber ich würde gerne verstehen, warum der Code, den ich gerade habe, nicht funktioniert.

Der folgende Code nicht viel von meinem Programm enthält (würde ziemlich lange dauern, in vollem Umfang schreiben), nur genug, um die Logik Prozesse zu verstehen, die ich zu verwenden versuche. Das sind Hausaufgaben für den Fall, dass es Ihnen gefällt, wie Sie die Frage beantworten möchten.

# Program to translate Roman Numerals to decimal values 

.data 
    numeralString: 
     .space 13 
# End Strings 

.text # Begin Program 
.globl main 

main: 
    li $v0, 8 # read string from user at next syscall 
    la $a0, numeralString 
    li $a1, 13 
    syscall 

    la $t0, numeralString # take input string and store in $t0 
    move $t1, $t0 # creating a copy of base register 
    lb $t2, 0($t0) # loads first byte (character) into $t2 

    jal evaluate # calls evaluate subroutine. String passed via $t0 (first byte/character specified in $t2) 
      # interger value returned via $v1 

    li $v0, 1 # print result value from $v1 at next syscall 
    move $a0, $v1 
    syscall 

exit: # Exit Program in next syscall 

    li $v0, 10 # exit program in next syscall 
    syscall 

evaluate: # matches numeral in string to correct subroutine 
    lb $t3, 1($t0) 
    beq $t2, 'M', mChar 

mChar: 
    addi $v1, $v1, 1000 
    # beq $t3, 'C', cSlot 
    j tailLoop 

tailLoop: 
    move $t2, $t3 # $t2 now holds next character of string 
    addi $t0, $t0, 1 
    bnez $t2, evaluate # Go back to evaluate if next character exists 
    jr $ra 

Antwort

0

Es ist mein Verständnis, dass der Systemaufrufcode Erlös Lese Zeichenfolge, bis er einen ‚\ n‘ Charakter erreicht, und wandelt das Zeichen und den Rest des leeren Raumes zu 0 Zeichen

Nr

Wenn man sich die spim source code schauen, sehen Sie, dass die read_input Funktion, die im Falle eines syscall

genannt wird

Simulieren [s] die Semantik von fgets (wird nicht) auf Unix-Datei.

According to CPlusPlus.com:

Ein Newline-Zeichen macht fgets aufhören zu lesen, aber es ist ein gültiges Zeichen von der Funktion und in die Zeichenkette kopiert str betrachtet.

Dies wird durch Überprüfung des Spim-Codes bestätigt.

Verwandte Themen