如何在MIPS中读取数组

时间:2014-02-16 05:54:51

标签: arrays assembly mips

这是C语言中的代码:

while(a<10){
    M[a] = a + b;
    a++; }

如何在Mips中用汇编语言重写它,不要使用伪指令。 M是32位元素的数组。 a寄存器$ s0,b in $ s1,$ s2是M array的基址。

我的代码:

      addi $s3, $zero, 10
LOOP: add $st1, $s0, $s1
      add $t2, $s2, $s0
      sw $t1, 0($s2)
      addi $s0, $s0, 1
      bne $s0, $s3, LOOP

但我觉得它有问题。 非常感谢你。

1 个答案:

答案 0 :(得分:0)

如果我使用这个C程序并将其编译为MIPS程序集:

int main() {

int b = 10;
int a = 20;
int M[20];

while(a<10){
    M[a] = a + b;
    a++; }
}

然后使用我的工具链,MIPS程序集变为:

    .file   1 "Cprogram.c"

 # -G value = 8, Cpu = 3000, ISA = 1
 # GNU C version cygnus-2.7.2-970404 (mips-mips-ecoff) compiled by GNU C version cygnus-2.7.2-970404.
 # options passed:  -msoft-float
 # options enabled:  -fpeephole -ffunction-cse -fkeep-static-consts
 # -fpcc-struct-return -fcommon -fverbose-asm -fgnu-linker -msoft-float
 # -meb -mcpu=3000

gcc2_compiled.:
__gnu_compiled_c:
    .text
    .align  2
    .globl  main
    .ent    main
main:
    .frame  $fp,112,$31     # vars= 88, regs= 2/0, args= 16, extra= 0
    .mask   0xc0000000,-4
    .fmask  0x00000000,0
    subu    $sp,$sp,112
    sw  $31,108($sp)
    sw  $fp,104($sp)
    move    $fp,$sp
    jal __main
    li  $2,10           # 0x0000000a
    sw  $2,16($fp)
    li  $2,20           # 0x00000014
    sw  $2,20($fp)
$L2:
    lw  $2,20($fp)
    slt $3,$2,10
    bne $3,$0,$L4
    j   $L3
$L4:
    lw  $2,20($fp)
    move    $3,$2
    sll $2,$3,2
    addu    $4,$fp,16
    addu    $3,$2,$4
    addu    $2,$3,8
    lw  $3,20($fp)
    lw  $4,16($fp)
    addu    $3,$3,$4
    sw  $3,0($2)
    lw  $2,20($fp)
    addu    $3,$2,1
    sw  $3,20($fp)
    j   $L2
$L3:
$L1:
    move    $sp,$fp         # sp not trusted here
    lw  $31,108($sp)
    lw  $fp,104($sp)
    addu    $sp,$sp,112
    j   $31
    .end    main