簡體   English   中英

將 C 代碼片段轉換為 MIPS 程序集

[英]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; . 我知道如何獲得ij的總和,但我不確定如何將其實際放入其 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM