1

次のMIPSアセンブリについて考えてみます(MIPSを使用しているのは、それが私のComputer Organisation and Designブックで使用されているためです)。

beq   $s0, $s1, L1
add   $t0, $t1, $t2
...
L1: ...

beqMIPSは命令のPC相対アドレスに16ビットしか使用しないため、L1から十分に離れているbeq場合、アセンブラはそれを2つの命令(ジャンプのアドレスは26ビット)と新しいラベルに置き換える必要があります。

bne   $s0, $s1, L2
j     L1
L2:   add $t0, $t1, $t2
...
L1: ...

これでも不十分な場合は、複数回のジャンプが必要になる場合があります。

アセンブラは、の場所を知るまで、この置換を行う必要があるかどうかを知りませんL1。最初は(1命令または2)のサイズがわからないのでbeq、最初のパスでロケーションカウンターを最新の状態に保つにはどうすればよいですか?

4

1 に答える 1

1

複数のアプローチがあります:

  • 1つの命令のためだけにスペースを予約し、それが十分でないことがわかった場合は、それを拡張します。
  • 2つの命令のために十分なスペースを予約してから、未使用のスペースをnop(s)で埋めるか、コードを圧縮します。

どちらの場合も、(半)最終的なマシンコードをすぐに生成する必要はありません。また、ソースコードを再スキャンして再アセンブルする必要もありませんが、可能です。最初に「中間」コードまたはその表現を生成してから、それを修正することができます。これは、リンカーが行うこととほぼ同じです。

[リンカー]と言えば、別のオプションもあります。

  • リンカが処理できるようにこの部分を残します。それほど難しいことではありません。現在、コンパイラ(Microsoft Visual C ++など)はリンク時のコード最適化を実行できます。
于 2012-09-10T21:29:40.380 に答える