4

私はこのアセンブラコードを持っています。これをバイナリ形式のマシンコードに変換することになっています。

        .text
        .align 2
        .global main
        .equ val,0x4712         

main:                           
        movi r16,val
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop
.end 

「bner16、r0、loop」と「brstop」がどのように解釈されるのかわかりません。

私の命令セットリファレンスは、bne命令がこれを行うと言っています:

if(rA != rB)
then PC ← PC + 4 + σ(IMM16)
else PC ← PC +4

これは、私が理解しているように、プログラムカウンターが4+オフセットまたは単に4だけインクリメントされていることです。

しかし、私の場合、offset / IMM16値は何ですか?命令セットリファレンスには次のように書かれています。

「命令エンコーディングでは、IMM16によって与えられるオフセットは、bneの直後の命令を基準にした符号付きバイト数として扱われます」。

私の解釈では、IMM16値は次の命令アドレスまでの「距離」ですが、これが正しいかどうかはわかりません。bneの16進アドレスは0x40010、brの16進アドレスは0x40014であるため、これはIMM16値が4であることを意味しますか?(これにより、rA!= rBの場合、PCが0x40014アドレスを飛び越えてしまいますか?)

4

1 に答える 1

4

免責事項:これがどの命令セットであるかは完全にはわかりません。そのため、アセンブリ言語の場合に通常当てはまるものに固執するようにします。

if(rA!= rB)thenPC←PC+ 4 +σ(IMM16)elsePC←PC+4

これは、私が理解しているように、プログラムカウンターが4+オフセットまたは単に4だけインクリメントされていることです。

正解です。PC ← PC + 4次のサイクルのためにプログラムカウンターを次の命令に移動するための命令をフェッチした後、CPUは基本的に常に実行することを覚えておくと役立つ場合があります。したがって、NOPでさえPC +=4(命令の長さが4バイトの場合)の効果的な結果が得られます。ウィキペディアにはもっとあります。

また、IMM16は負になる可能性があるため、後方にジャンプできます。

しかし、私の場合、offset / IMM16値は何ですか?命令セットリファレンスには次のように書かれています。

「命令エンコーディングでは、IMM16によって与えられるオフセットは、bneの直後の命令を基準にした符号付きバイト数として扱われます」。

私の解釈では、IMM16値は次の命令アドレスまでの「距離」ですが、これが正しいかどうかはわかりません。bneの16進アドレスは0x40010、brの16進アドレスは0x40014であるため、これはIMM16値が4であることを意味しますか?(これにより、rA!= rBの場合、PCが0x40014アドレスを飛び越えてしまいますか?)

IMM16の値距離ですが、万が一の場合にジャンプする命令までの距離(バイト単位)rA != rBです。したがって、この場合、bne(距離は次の命令に相対的であるため)次の命令からジャンプしたい場所までの距離をイミディエートにする必要があります(loop)。この場合(私の計算が正しければ)address(jump-target) - (address(bne-instruction) + 4) = 0x40008 - (0x40010 + 4) = -12 = ~12 + 1 = 0xfff4 (16-bit)

命令のエンコードについて心配しているので、イミディエートに適用されるシグマ関数に注意してください。知識に基づいた推測を行い、イミディエートに4を掛けると、命令のエンコードには、ジャンプする命令の数から1を引いた数が含まれると想定します。つまり、-12バイトはおそらく16ビットの符号付き値としてエンコードされます。これは0xfffc = -3、2つの命令を元に戻し、bneの命令から3つの命令を元に戻すためです。 bne

それが本当なら、次の指示がないので、IMM16値brが何を持っているのかまだわかりません。ラベルが「停止」のときはゼロかもしれません。(または、rA!=rBかつPC←PC+ 4 +σ(IMM16)の場合にどのようなbneが発生するか)。

エンコーディングが異なる場合があることに注意してくださいbr(たとえば、絶対オフセットの場合もあれば、サイズが異なる場合もあります)。手元にある命令セットについては十分に理解していませんが、一般的な考え方を説明できます。次の命令のアドレスを実際に使用しているのではなく、現在の命令のアドレス+ 4(命令が続く場合は、その命令のアドレスになります)。

于 2011-10-03T19:05:16.063 に答える