[英]Converting C code snippet to MIPS Assembly
作為家庭作業的一部分,我們需要將以下代碼片段從 C 轉換為 MIPS 程序集:
for (i=0; i<A; i++) {
for (j=0; j<B; j++) {
C[4 * j] = i + j;
}
}
我相信我的邏輯是錯誤的,並且大部分代碼都是正確的。 我只是卡在這條線上: D[4 * j] = i + j;
. 我知道如何獲得i
和j
的總和,但我不確定如何將其實際放入其 j 地址的倍數中。 有人可以告訴我我在loop2中缺少什么嗎? 謝謝
.data
A: .word 2
B: .word 5
D: .word 0 : 100
size: .word 100
.text
.globl main
main:
lw, $s0, A #$s0 = A
addi $s0, $s0, -1 #Allows for loop to properly run
lw $s1, B #$s1 = B
addi $s1, $s1, -1 #Allows for loop to properly run
la $s5, C # load address of array
li $t0, 0 #i = 0
li $t1, 0 #j = 0
loop1:
blt $s0, $t0, Exit #for(i = 0; i < A; i++)
addi $t0, $t0, 1 #i++
li $t1, 0 #Sets j to 0 before calling loop2
j loop2 #Calls loop2
loop2:
blt $s0, $t0, loop1 #for(j = 0; j < B; j++)
addi $t2, $t0, -1 #Allows to properly perform loop
{Where I'm confused what to do}
{Last two steps of loop2}
addi $t1, $t1, 1 #j++
j loop2
Exit:
# The program is finished. Exit.
li $v0, 10 # system call for exit
syscall # Exit!
您的匯編代碼幾乎與您展示的 C 等效代碼相似。 例如,C 代碼中沒有-1
,但在匯編代碼中多次使用!
因此,在從 C 轉換到 assembly 期間,您已經采用了經典的容易出錯的超優化代碼的方法。 這是一個非常容易出錯的過程,也是不必要的!!
進行這種指針和循環優化的最佳方法是首先在 C 中完成所有這些,我們可以直接在 C 中表達諸如此類和其他許多優化! 然后在 C 中對其進行測試以確保它可以正常工作,然后才知道至少該算法可以工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.