[英]Converting a C program into MIPS assembly language program
我正在嘗試將 C 程序轉換為 MIPS 匯編程序。 以下是我的程序 C 代碼:(注意:Bulbs[number] 是一個數組,對於用戶輸入的“數字”,初始化為全零值)
for(int i = 1; i <= number; i++)
for(int j = 1; j <= number; j++)
if(j % i == 0)
Bulbs[j-1] = (Bulbs[j-1] + 1) % 2;
到目前為止,我所擁有的如下:
li $t0, 0 #$t0 is set to 0 to be used as index for for loop1
li $t1, 0 #$t1 is set to 0 to be used as index for for loop2
li $s2, 4 #integer 4 is stored in s2
mult $s3, $s2 #input number($s3) is multiplied by 4
mflo $s4 #result of multiplication is stored in $s4
loop1:
bgt $t0, $s4, end_loop1 #if t$0 > $s4(input number*4), exit loop1,
#performing multiplication by 4 since word occupies 4 bytes
addi $t3, $t3, 1 #t3 is initialized to serve as "i" from for loop1
loop2:
bgt $t1, $s4, end_loop2 #if $t1 > (input number*4), exit loop2
addi $t4, $t4, 1 #t4 is initialized to serve as "j" from for loop2
div $t4, $t3
mfhi $t5 #$t4 % $t3 is stored in $t5
bne $t5, $zero, if_end #checking for if condition
if_end:
addi $t1, $t1, 4 #increment $t1 by 4 to move to next array element
j loop2 #jump back to top of loop2
end_loop2:
addi $t0, $t0, 4 #increment $t0 by 4
j loop1 #jump back to the top of loop1
end_loop1:
我認為我的 for 循環實現有效,並且我准確地設置了 if 條件(如果我錯了,請糾正我),但我不知道如何實現 'Bulbs[j-1] = (Bulbs[j- 1] + 1) % 2;' 在我的 if 條件之后行。 我是 MIPS 的新手,希望得到任何幫助或反饋!
我假設您在某處將Bulbs
定義為數組。 然后
Bulbs[j-1] = (Bulbs[j-1] + 1) % 2;
應該翻譯成類似的東西:
la $t7, Bulbs # Move base pointer of bulbs to $t7
add $t7, $t7, $t1 # $t7 = &Bulbs[j]
lw $t6, -4($t7) # $t6 = Bulbs[j - 1]
addi $t6, $t6, 1 # $t6 = Bulbs[j - 1] + 1
andi $t6, $t6, 1 # $t6 = (Bulbs[j - 1] + 1) % 2
sw $t6, -4($t7) # Bulbs[j - 1] = $t6
這是基於此信息。 我之前沒有做過MIPS組裝,但它是RISC,那么難嗎? :)
順便說一句,您的程序集翻譯中似乎存在錯誤。 在 C 版本中,你的j
從 1 開始,而在匯編版本中它似乎從 0 開始( $t1
數組索引在第二行被初始化為 0,直到循環體之后才被修改)。 修復很簡單 - 將其初始化為 4 而不是 0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.