2017-01-03 2 views
1

Verzeihen Sie mir die Leichtigkeit dieser Frage, aber ich bin neu auf MIPS und bin immer eine ungerade Fehler:MIPS nicht NULL erkennen

.data 

myString: .asciiz "P5" 


.text 


li $v0 4 

la $a0, myString 
newLoop: 
    syscall 
    addi $a0, $a0, 1 
    beq $a0, $zero, done 

    j newLoop 

done: 
    li $v0, 10 
    syscall 

Mein Programm endet nie, trotz der Tatsache, dass es eine Null-Zeichen (wie Ich habe am Ende von myString aus anderen Posts gelesen, die $ 0 entsprechen). Ich hätte gedacht, dass $ a0 auf "P", dann "5", dann "\ 0" zeigen würde und dann zu done springen und beenden würde.

Danke für Ihre Augen!

Antwort

1

Was Sie mit Null vergleichen, ist die Adresse, nicht der Wert an dieser Adresse. Sie benötigen etwas wie:

lbu $t0,($a0)  # load the byte pointed to by $a0 
beq $t0,$zero,done 
+0

Vielen Dank Michael. Was ich also durch den Vergleich von Zeigern mache, ist, zu sagen, ob sie im wahrsten Sinne des Wortes auf dieselbe Stelle im Gedächtnis zeigen, als wenn sie denselben Wert haben? Stimmt es also, dass ich beim Vergleichen von Strings diese dereferenzieren muss? – Uzebeckatrente

+0

Ja, was Sie jetzt tun, überprüft, ob '$ a0' ein NULL-Zeiger ist, nicht, wenn es auf ein NULL-Byte zeigt. – Michael

+0

Mit "Was machst du gerade" meinst du, was ich ursprünglich geschrieben habe, aber du bist die Lösung für das NULL-Byte, oder? – Uzebeckatrente