2017-01-01 12 views
3

私が書いている8086アセンブラに問題があります。 問題は、アセンブラの問題です。アセンブラが問題を解決する

パス1では、各ラベルのセグメントに対する相対的な位置を計算します。

これで、各命令のサイズを計算し、オフセットに加算する必要があります。

ラベルの位置が範囲内にある場合、8086の命令のほうが小さくなる必要があります。たとえば、 "jmp _label"は可能な場合はショートジャンプを選択し、そうでない場合は近いジャンプを選択します。

問題はパス1に達しています。したがって、ラベルにまだ到達していないため、 "jmp short _label"が "jmp near _label"命令よりも小さいため、命令のサイズを判断できません。

天気「jmp _label」が「jmp short _label」になるかどうかはどうやって決められますか?

現在の命令がオフセットを与える前にすべての命令のサイズを知る必要があるので、3回のパスも問題になる可能性があります。あなたは何ができるか

おかげ

+0

私は可能な解決策を考えました。同意すれば教えてください。 – NibbleBits

+0

あなたが同意すれば私は可能な解決策を考えましたか? 私ができることは、推測して短いジャンプを選択することです。セグメントのサイズを計算し終えたら、それを追跡して、すべての命令のオフセットを修正するのが間違っているかどうかを確認します。これは遅いですが、誰かがより良い方法を持っていればうまくいくでしょう。 – NibbleBits

+0

私は8086用のアセンブラを書いています。そこからアセンブリを生成するコンパイラを作成したので、アセンブラはマシンコードを作成します。 – NibbleBits

答えて

3

短いジャンプが十分であることを行っていることを前提で開始しています。ジャンプ距離を見つけたとき(またはそれが変わったとき)に仮定が無効になった場合、ショートジャンプを近くのジャンプに展開します。この展開の後、展開されたジャンプに続くラベルのオフセットを調整する必要があります(近接ジャンプ命令の長さからショートジャンプ命令の長さを引いた値)。この調整により、他のいくつかの短いジャンプが不十分になることがあり、ジャンプの近くに変更する必要があります。したがって、実際には2回以上の繰り返しがあるかもしれません。

これを実装するときは、ジャンプ命令を展開するときにメモリ内のコードを移動しないようにしてください。それは組み立てをひどく遅くします。アセンブリのソースコードも再解析しないでください。

ジャンプとラベルの間にある種の依存関係テーブルを事前計算することもできます。ラベルをスキップしたり、拡張ジャンプ命令の影響を受けない命令をジャンプすることができます。

もう1つ考えておきたいことは、ショートジャンプに127バイトの前方距離があり、次の命令が127バイトを超えてターゲットラベルにまだ遭遇しない場合、近くにジャンプすることができます右にジャンプします。いずれの瞬間でも、このように近づく可能性がある最大64の前方ショートジャンプがあるかもしれないことに留意してください。

+0

私は自分の投稿のコメントにsimularなことを提案しました。あなたの投稿はずっと面白い解決策です。私はあまりにもあなたが完全に正しい、他の人に影響を与えることができる1つのジャンプを変更する瞬間に自分自身に考えた。私は誰かが私と同意してうれしいです、これは私が正しい軌道に乗っていることを意味する必要があります。非常に感謝しています:) – NibbleBits

+0

私はあなたが私の他の質問で助けることができるとは思わない?誰も答えておらず、約1ヶ月経っています:http://stackoverflow.com/questions/41022380/omfobject-module-format-length-field-appears-incorrect – NibbleBits

+0

オープン可能なジャンプの軌跡を維持しすぎてはいけませんそれは通常は手のひらでしかありません(Alexeyが<64で述べたように)、それはあなたが記憶のブロックを動かすのを防ぐことができます。私はこのオプションを(おそらく巨大な)クロスリンク関連ジャンプリストよりも好むでしょう。そして、あなたは予測することができます:2つのジャンプが開いていて、すでに '128-2x(ジャンプの数が開いています)'バイトが使用されている場合、どちらも長くなります – Tommylee2k