簡體   English   中英

將C語句轉換為MIPS匯編指令?

[英]Translating a C statement into MIPS assembly instructions?

我還有另一個作業問題,就像我在本網站上問的最后一個問題一樣,老師或教科書都沒有很好地解釋。 這是問題:

將此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) )接下來該怎么辦?

編譯器只能翻譯完整的程序,因此這里是一個完整的程序,其中包含您的指令,並將其翻譯為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM