1

次の C コードを MIPS64 に変換する必要がありました。

#include <stdio.h>

int main() {
    int x;
    for (x=0;x<10;x++) {
    }
    return 0;
}

コードベンチを使用して、このコードを MIPS64 にクロスコンパイルしました。次のコードが作成されました。

    .file   1 "loop.c"
    .section .mdebug.abi32
    .previous
    .gnu_attribute 4, 1
    .abicalls
    .option pic0
    .text
    .align  2
    .globl  main
    .set    nomips16
    .set    nomicromips
    .ent    main
    .type   main, @function
main:
    .frame  $fp,24,$31      # vars= 8, regs= 1/0, args= 0, gp= 8
    .mask   0x40000000,-4
    .fmask  0x00000000,0
    .set    noreorder
    .set    nomacro
    addiu   $sp,$sp,-24
    sw  $fp,20($sp)
    move    $fp,$sp
    sw  $0,8($fp)
    j   $L2
    nop

$L3:
    lw  $2,8($fp)
    addiu   $2,$2,1
    sw  $2,8($fp)
$L2:
    lw  $2,8($fp)
    slt $2,$2,10
    bne $2,$0,$L3
    nop

    move    $2,$0
    move    $sp,$fp
    lw  $fp,20($sp)
    addiu   $sp,$sp,24
    j   $31
    nop

    .set    macro
    .set    reorder
    .end    main
    .size   main, .-main
    .ident  "GCC: (Sourcery CodeBench 2012.03-81) 4.6.3"

コードが期待どおりに機能するかどうかを確認するために、私は通常、WINMIPS64 シミュレーターを使用します。何らかの理由で、このシミュレーターはこのコードを受け入れたくありません。コードのすべての行が間違っているようです。私はこの問題を1日以上見てきました。誰かがこれで私を助けてくれることを願っています。mips64 アーキテクチャ用のこのアセンブリ コードの何が問題になっていますか?

4

1 に答える 1

5

WINMIPS64ドキュメントの 7 ページから:

The following assembler directives are supported

.data                 - start of data segment
.text                 - start of code segment
.code                 - start of code segment (same as .text)  
.org    <n>           - start address
.space  <n>           - leave n empty bytes
.asciiz <s>           - enters zero terminated ascii string
.ascii  <s>           - enter ascii string
.align  <n>           - align to n-byte boundary
.word   <n1>,<n2>..   - enters word(s) of data (64-bits)
.byte   <n1>,<n2>..   - enter bytes
.word32 <n1>,<n2>..   - enters 32 bit number(s)
.word16 <n1>,<n2>..   - enters 16 bit number(s)
.double <n1>,<n2>..   - enters floating-point number(s)

シミュレーターで実行されないため、上記のリストにないものはすべて削除してください。

.alignを前に移動する必要があります.text

WINMIPS64 はdaddi/dadduiの代わりにaddi/を想定addiuしています。これもドキュメントのとおりです。

ドキュメントによるmove $a, $bと、サポートされているニーモニックではありません。代わりにそれらを置き換えますdaddui $a, $b, 0

sltである必要がありますslti

最後に、シミュレーターは の絶対アドレスを想定してjいますが、レジスターを指定しています。jr代わりに使用してください。

この時点で、無限ループに陥ります。これは、スタック ポインターが初期化されないためです。シミュレータは 0x400 バイトのメモリしか提供しないため、スタックを 0x400 に初期化します。

.text
    daddui  $sp,$0,0x400

、それは実行されます。コードを単独で実行しているため、リターン レジスタには何も入っておらず、finaljr $31はそれを最初に戻すだけです。

これが私のバージョンです:

    .align   2
    .text
    daddui   $sp,$0,0x400
main:
    daddui   $sp,$sp,-24
    sw       $fp,20($sp)
    daddui   $fp,$sp,0
    sw       $0,8($fp)
    j        $L2
    nop

$L3:
    lw       $2,8($fp)
    daddui   $2,$2,1
    sw       $2,8($fp)
$L2:
    lw       $2,8($fp)
    slti     $2,$2,10
    bne      $2,$0,$L3
    nop

    daddui   $2,$0,0
    daddui   $sp,$fp,0
    lw       $fp,20($sp)
    daddui   $sp,$sp,24
    jr       $31
    nop

これらは明らかにお互いを嫌っているので、別のコンパイラまたは別のシミュレータを入手することを検討してください。

于 2012-10-12T17:23:52.093 に答える