3

MUL演算子が単一のオペランド形式しかない理由はありますか?
IMUL演算子は、3つの異なる形式(1つ、2つ、または3つのオペランド)にすることができ、これははるかに便利です。技術的な観点から、MUL演算子が2つまたは3つのオペランド形式にできない理由はわかりません。

4

3 に答える 3

4

NASMがそれをサポートしていないわけではありません。CPUでは、命令の署名付きバージョンは、署名なしバージョンよりも多くのバリアントをサポートしているだけです。

于 2010-10-18T21:23:58.310 に答える
4

それは出力されるバイトコードと関係があります。80286より前の世界では、オペコードが多すぎたため、Intelのエンジニアは問題を克服する方法を見つけていました。1つの解決策は、演算(この場合は乗算)を指定するバイトコードの部分を、最初のオペランドをエンコードしたバイトコードの部分に拡張することでした。これは明らかに、MULオペコードを実行するときにサポートできるオペランドは1つだけであることを意味します。乗算には2つのオペランドが必要なため、最初のオペランドが常にeaxレジスタになるようにプロセッサにハードコーディングすることで、問題を解決しました。その後のプロセッサは、複数の長さのバイトコードをサポートし、より多くのデータを1つのコマンドにエンコードできるようになりました。これにより、IMULオペコードをはるかに便利にすることができました。

今日、IPアドレスが不足しているという興味深い類似点があります。

于 2011-02-04T14:28:11.610 に答える
1

186命令セットでは、3オペランドimul、および即値オペランドを持つ2オペランド形式(3オペランド形式のエイリアス)が導入されました。その後、386は、レジスタとr/mオペランドを持つ2つのオペランドの形式を追加しました。

これらの新しい形式はすべて、16ビット×16ビット(おそらく符号拡張された8ビットイミディエートから)で16ビットの結果が得られるか、32ビット×32ビットで32ビットの結果が得られるかのいずれかで乗算が行われるという共通点があります。これらの場合、結果の下位16ビットまたは下位32ビットは、imul同等の場合と同じですがmul、フラグ(CFとOF)のみが異なる場合があります。したがって、個別のマルチオペランドmulは必要ありません。おそらく、imul8ビットの即時型のフォームはその即時型を符号拡張するため、設計者はニーモニックを使用しました。

于 2019-08-28T21:20:10.373 に答える