2013-03-11 51 views
0
#include <stdio.h> 

int source[] = {3, 1, 4, 1, 5, 9, 0}; 
int dest[10]; 

int main () { 
    int k; 
    for (k=0; source[k]!=0; k++) { 
    dest[k] = source[k]; 
    } 
    printf ("%d values copied\n", k); 
    return 0; 
} 

這是C代碼C至MIPS源和dest指針

相當簡單,它只是拷貝數組的值,以dest數組中,除非它是0

現在,問題是用MIPS的代碼

.file 1 "arrcopy.c" 
    .globl source 
    .data 
    .align 2 
source: 
    .word 3 
    .word 1 
    .word 4 
    .word 1 
    .word 5 
    .word 9 
    .word 0 
    .rdata 
    .align 2 
$LC0: 
    .ascii "%d values copied\n\000" 
    .text 
    .align 2 
    .globl main 
    .ent main 
main: 
    .frame $sp,24,$31  # vars= 0, regs= 1/0, args= 16, extra= 0 
    .mask 0x80000000,-8 
    .fmask 0x00000000,0 
    subu $sp,$sp,24 
    sw $31,16($sp) 
    jal __main 
    la $9,source 
    lw $2,0($9) 
    move $8,$0 
    beq $2,$0,$L8 
    move $7,$0 
    la $10,dest 
$L6: 
    addu $8,$8,1 
    sll $3,$8,2 
    addu $5,$7,$9 
    addu $2,$3,$9 
    addu $6,$7,$10 
    lw $4,0($2) 
    move $7,$3 
    lw $3,0($5) 
    #nop 
    sw $3,0($6) 
    bne $4,$0,$L6 
$L8: 
    la $4,$LC0 
    move $5,$8 
    jal printf 
    lw $31,16($sp) 
    move $2,$0 
    addu $sp,$sp,24 
    j $31 
    .end main 

    .comm dest,40 

我根本看不出來,源指針是什麼,目標指針

甚至不知道什麼時候在循環開始

我想到它在$ L6

開始是用它來加載源和目標指針的地址是什麼指示?

如果你們可以找到循環,你可以給我一個關於每一行是幹什麼的想法嗎?

它看起來比手等不同

回答

3

,我加入了一些註釋來說明拆卸:

la $9,source  # The source pointer 
    lw $2,0($9)  # Load source[0] 
    move $8,$0  # "next_k" 
    beq $2,$0,$L8  # skip the loop if source[0]==0 
    move $7,$0  # k 
    la $10,dest  # destination pointer 
$L6: 
    addu $8,$8,1 # Increase the next_k counter 
    sll $3,$8,2  # scale to a word offset (multiply by 4) 
    addu $5,$7,$9 # $5 = &source[k] 
    addu $2,$3,$9 # $2 = &source[next_k] 
    addu $6,$7,$10 # $6 = &dest[k] 
    lw $4,0($2)  # $4 = source[next_k] 
    move $7,$3  # k = next_k (i.e. k++) 
    lw $3,0($5)  # $3 = source[k] 
    #nop 
    sw $3,0($6)  # dest[k] = source[k] 
    bne $4,$0,$L6  # Loop until source[next_k]==0 
$L8: 
+0

這簡直是最好的東西是永遠不會 – user2054534 2013-03-11 13:31:55

+0

是加載地址阿杜的命令和不是啦?像什麼指令是用來加載指針的源地址和目的地址的? ? – user2054534 2013-03-11 18:30:28

+0

'la'用於加載指針,'addu'用於向指針添加偏移量。 – Michael 2013-03-11 19:45:50