c来mips source和dest指针

时间:2013-03-11 11:35:32

标签: c mips

#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代码

非常简单,它只是将数组的值复制到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开始

用什么指令加载源指针和dest指针的地址?

如果你们能找到循环,你能不能让我知道每条线路在做什么?

它看起来与手工不同

1 个答案:

答案 0 :(得分: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: