0
    .text
    .align 2
    .global main
    .equ val,0x4712         # 16-bit binary code for 0x4712: 0100 0111 0001 0010
                            # Program code starts now
main:                          
        movi r16,val
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop

上記をマシンコードに変換するにはどうすればよいですか?実際のコード以外に、翻訳の仕方を知る必要があります。命令のオペコードを取得できると思いますが、moviは疑似命令であり、どこで取得できるかわかりません。Nios IIのマニュアルで読む必要がありますか?

アップデート

最初の4つの命令は即時型であるため、フィールド形式を使用する必要があります。moviとsubiはどちらもaddiに実装された疑似命令であるため、addiのオペコードが使用されます。私は助けられました、そして私は指示movi r16, valがに翻訳されることを知っています

00000100000100011100010010000100

したがって、オペコードは000100バイナリであり、16進数で0x04であり、マニュアルにもaddiのオペコードであると記載されています。したがって、最初の4つのオペコードがあると思います。それらはすべて000100です。

アップデート2

私は今、ほとんどの命令のオペコードと直接のフィールドを知っていると思います:

シーケンス0100011100010010は0x4712であり、これはvalで宣言された変数です。.equ, したがって、最初の4つのオペコードはすべてaddiであり、addiは0x04であると言うため、000100である必要があります。レジスタの2つの5ビットフィールドを変換する方法は今はわかりませんが、マニュアルで確認できます。' has opcode 0x06 so it should say 000110 in the opcode for br.brbne`にはopkod0x1Eがあり、バイナリは011110 = 30(?)

これは正しい始まりですか?

4

1 に答える 1

2

まずは、アセンブラを使って何ができるか試してみませんか?

実際の mips 命令を確認するには、mips 命令セットのリファレンスを読む必要があります。多くの場合、疑似命令はこれらのリファレンスで説明されています。movi に関する限り、load upper は上位ビットを制御するために少し明白であり、and or or or or は下位ビットを設定する明らかな方法です。値が小さい数値の場合は、オペランドの 1 つとして r0 のみを使用する必要があります (上位ビットをゼロにするため)。

mips でのこれらの疑似命令の問題は、ブランチ シャドウで疑似命令を使用しないように注意する必要があることです (単一の命令に変換されない限り)。最初は疑似命令を使用せずにアセンブリ言語を学習し、後で作業を楽にするために、命令セットとルールを理解したら、疑似命令を使用してコードを読みやすく保守しやすくすることをお勧めします。純粋な命令にとどまり、1 対 1 のエクスペリエンス (asm 命令から機械命令) を提供します。

于 2012-08-15T17:40:36.683 に答える