2016-09-15 3 views
0

私たちのMIPS実装をFPGA上でテストするために、私はいくつかのアセンブラテストコードを書いています。私はコンパイル時にmips-linux-gnuを使っています。divu MIPS命令でのGNU ASの動作のばらつき

次のコードは、コードから条件beq $ t2、$ t1、label1が予想され、3が$ t1にロードされていることをテストすることです。

.set noreorder 
.text 
__start: 
    li $t1, 10   
    li $t2, 2 

    divu $t1, $t2 
    mflo $t2 
    li $t1, 5 
    beq $t2, $t1, label1 
    j label2 
label1: 
    li $t1, 3 
label2: 
    nop 

私の問題は、GNU-として実行の異なる振る舞いで終わる上記のコードのための奇妙な出力を生成し、3は$ T1にロードされることはありません。

00000000 <__start>: 
0: 2409000a  addiu t1,zero,10 
4: 240a0002  addiu t2,zero,2 
8: 15400002  bnez t2,14 <__start+0x14> 
c: 012a001b  divu zero,t1,t2 
10: 0007000d  break 0x7 
14: 00004812  mflo t1 
18: 00005012  mflo t2 
1c: 24090005  addiu t1,zero,5 
20: 11490001  beq  t2,t1,28 <label1> 
24: 0800000b  j  2c <label2> 

00000028 <label1>: 
28: 24090003  addiu t1,zero,3 

0000002c <label2>: 
2c: 00000000  sll  zero,zero,0x0 

.textセクションのdiassembly任意の助けを大幅に高く評価されています。

答えて

1

遅延スロットで分岐やジャンプが発生しないことがあります。 beqの遅延スロットにjがあります。また、私はaddiu t1, zero, 3jの遅延スロットに入れたいとは思わない。おそらく.set noreorderの代わりに.set reorderを使用してください。あるいは、ブランチ遅延スロットを処理する方法を学ぶ必要があります。

+0

私の問題は、gccがdivu命令のために生成したコードを理解できないということです。 RISCのパイプラインの私の理解から、その人は常に実行されることです。しかし、なぜ生成されたコードがt1(mflo t1)のloの値をロードしていますか?私はt1が10として値を保持する必要があることを意味する... –

+0

@AliAbdallah私は余分なmfloがそこで何をしているかわからない。コンパイラーがCPUバグを回避するために(例えば、除算のための時間を挿入するために遅延を挿入するために)、それを生成する可能性があります。あなたの文脈では、この余分な命令は、少なくとも現代のMIPS CPUでは役に立たず、無害です。しかし、これは実際の問題とは何の関係もありません。ブランチ遅延スロットをどのように処理しているかです。 –