将C语句翻译成MIPS汇编指令?

时间:2014-02-11 02:58:45

标签: c arrays assembly mips offset

我有另一个家庭作业问题,就像我在本网站上提出的最后一个问题一样,老师和教科书都没有很好地解释。这是问题:

将此C语句转换为MIPS汇编指令:

   B[8] = A[i-j];

假设变量f,g,h,i和j分别分配给寄存器$ s0,$ s1,$ s2,$ s3和$ s4。假设数组A和B的基地址分别在寄存器$ s6和$ s7中。

现在,我陷入困境的是添加两个变量并将结果用作偏移量。到目前为止,我有以下内容:

sub $t0, $s3, $s4 # add values to get offset amount, store in $t0
sll $t1, $t0,2    # multiply the offset by 4, store in $t1

现在,我不知道是否可以使用$t1作为访问该数组元素的偏移量。看起来教科书只使用数字(例如4($s7))而不是寄存器(例如$t1($s7))我接下来该做什么?

1 个答案:

答案 0 :(得分:0)

编译器只能翻译完整的程序,所以这里是一个包含你的指令的完整程序,它转换成MIPS组装指令。我希望你能研究一下这里做了什么并得出一些结论。

int main() {

int i = 3;
int j = 2;
int B[3] = {10, 20, 30};
int A[3] = {100, 200, 300};

B[8] = A[i-j];
}

上述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:
    .rdata
    .align  2
$LC0:
    .word   10
    .word   20
    .word   30
    .align  2
$LC1:
    .word   100
    .word   200
    .word   300
    .text
    .align  2
    .globl  main
    .ent    main
main:
    .frame  $fp,64,$31      # vars= 40, regs= 2/0, args= 16, extra= 0
    .mask   0xc0000000,-4
    .fmask  0x00000000,0
    subu    $sp,$sp,64
    sw  $31,60($sp)
    sw  $fp,56($sp)
    move    $fp,$sp
    jal __main
    li  $2,3            # 0x00000003
    sw  $2,16($fp)
    li  $2,2            # 0x00000002
    sw  $2,20($fp)
    addu    $2,$fp,24
    la  $3,$LC0
    lw  $4,0($3)
    lw  $5,4($3)
    lw  $6,8($3)
    sw  $4,0($2)
    sw  $5,4($2)
    sw  $6,8($2)
    addu    $2,$fp,40
    la  $3,$LC1
    lw  $4,0($3)
    lw  $5,4($3)
    lw  $6,8($3)
    sw  $4,0($2)
    sw  $5,4($2)
    sw  $6,8($2)
    lw  $2,16($fp)
    lw  $3,20($fp)
    subu    $2,$2,$3
    move    $3,$2
    sll $2,$3,2
    addu    $3,$fp,16
    addu    $2,$2,$3
    addu    $3,$2,24
    lw  $2,0($3)
    sw  $2,56($fp)
$L1:
    move    $sp,$fp         # sp not trusted here
    lw  $31,60($sp)
    lw  $fp,56($sp)
    addu    $sp,$sp,64
    j   $31
    .end    main