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コードです

非常に単純で、0でない限り、配列の値をdest配列にコピーするだけです。

今、問題は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から始まると思っています

ソースポインタと宛先ポインタのアドレスをロードするためにどの命令を使用していますか?

ループを見つけることができたら、各行が何をしているのかを教えていただけますか?

手で見るのとはとても違って見えます

4

1 に答える 1

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:
于 2013-03-11T13:05:42.363 に答える