2017-04-19 106 views
1

這是迄今爲止我已轉換的C代碼。它給了我一些錯誤,我已經包含在下面的代碼中。我不明白哪個部分是錯誤的在這個C來碾壓轉換?將C代碼轉換爲mips會給出錯誤

char ch[10]; 
int i; 
for (i = 0; i != 10; i++) 
ch[i] = ch[i] – 32 


.data 

.text 
li $v0 4 
syscall 

#$s1 = i, $s0 base address of ch 

addi $s1, $0, 0    #i =0 
addi $t0, $0, 10    #t0 = 10 
loop: beq $t0, $s1, end  
add $t1, $s1, $s0 
lw $t2, 0($t1) 
addi $t2, $t2, -32 
sw $t2, 0($t1) 
addi $s1, $s1, 1 
j loop 
end: 

我的輸出:

Runtime exception at 0x00400018: address out of range 0x00000000 
+0

自從MIPS對我來說已經有一段時間了,但它看起來像一個空的寄存器。更重要的是,當你在MIPS中編碼時,你應該逐行評論,否則調試將是一場噩夢。 – Forklift

+0

你沒有初始化'$ s0'。此外,還不清楚'syscall'應該做什麼,因爲系統調用4期望'$ a0'中的字符串地址。 – Michael

回答

1

從C代碼您正在轉換char型陣列和MIPS應該使用lb代替lw

爲了打印出你需要一個main:標籤,你也應該聲明一個數組一樣.byte.space

您應該使用syscall 11打印字符或syscall 4打印 字符串。

我已經添加了一些上面提到的代碼,希望它有幫助。

.data 
    #ch: .byte 'a','b','c','d','e' 
    ch: .space 10 
    .text 
    main: 


      li $v0, 8  #read character 
      li $a1, 10  #load the space 
      la $a0, ch  
      syscall 

      li $v0,11  #print character 
      syscall 

      li $v0,10  # exit program 
      syscall 

      addi $s1, $0, 0  #i = 0 
      addi $t0, $0, 10 # $t0 = 10 
    loop: beq $t0, $s1, end 
      add $t1, $s1, $s0 
      lb $t2, ch($t1) 
      addi $t2, $t2, -32 
      sb $t2, ch($t1) 
      addi $s1, $s1, 1 
      j loop 
    end: