2012-12-20 39 views
1

我以mips32開頭,當我試圖從字符串中獲取一個字母來打印它時,我陷入了困境。該代碼應該得到該字符串,逐字符地打印它,並找到一個i打印iiing在mips32上加載字節

.data 
msg: .asciiz "testing" 
i: .asciiz "iiing" 

.text 

.globl main 

main:   
    la $t0, msg 
    la $t1, i 
    li $t2, 0 
loop: 
    bneq $t0, 105, end #$t0=i? 
    lb $a0, ($t0) 
    li $v0, 4 
    syscall 
    addi $t0, $t0, 1 
    b loop 

end: 
    move $a0, $t1 
    li $v0, 4 
    syscall 

問題在哪裏?

回答

0

你有幾個問題。

  1. 你是比較$t0,這是當前字符的地址,而不是字符本身。將該測試移動到lb以下並根據$a0進行測試。

  2. 105 in ASCII是E而不是i。嘗試151(或更正常的,0x69)。

  3. 您想要與beq比較,而不是bneq

  4. 在循環內部,您應該使用系統調用11,該系統會打印一個字符,而不是您正在使用的當前系統調用4,該系統會打印一個字符串。

  5. 您的程序最後不會出現系統調用(10)。

您可以查看this link獲取系統調用列表。

下面是引用一個完整的工作程序:

.data 

msg: .asciiz "testing" 
i: .asciiz "iiing" 

    .text 
    .globl main 

main:   
    la $t0, msg 
    la $t1, i 
    li $t2, 0 

loop: 
    lb $a0, ($t0) 
    beq $a0, 0x69, end 
    li $v0, 11 
    syscall 
    addi $t0, $t0, 1 
    b loop 

end: 
    move $a0, $t1 
    li $v0, 4 
    syscall 
    li $v0, 10 
    syscall 
+0

實際上,你是對的,但要做出這樣的修改,我仍然得到一個埃羅在支線,只是我已經missunderstood,你的意思是一樣的情況下這個? loop: \t \t lb $ a0,($ t0) \t \t bneq $ a0,0x69,end#$ t0 = i? \t \t \t \t \t李$ V0,4 \t \t \t系統調用 \t \t \t阿迪$ T0,$ T0,1個 \t \t \t b環 – qwerty

+0

這看起來接近,但你可能想'beq',現在我看得更近。你也許應該更新評論來匹配你正在做的操作('$ a0'和'$ t0')。 –

+0

是的,真的,但它仍然沒有檢測到字符與磅,我的意思是它打印(空)null..iiing,任何想法爲什麼?對不起,這麼多愚蠢的問題.. – qwerty