12

DosBox エミュレーターを使用して x86 のアセンブリを学習しています。乗算を実行しようとしています。仕組みがわかりません。次のコードを書くと:

mov al, 3
mul 2

エラーが発生します。私が使用しているリファレンスでは、乗算で述べられていますが、AX が常にプレースホルダーであると想定しているため、次のように記述します。

mul, 2

値を 2倍alします。しかし、私にはうまくいきません。

次のことを試すと:

mov al, 3
mul al,2
int 3

axで結果9を取得します。明確にするために、この図を参照してください。 ここに画像の説明を入力

別の質問: メモリの場所を直接使用して乗算できますか? 例:

mov si,100
mul [si],5
4

2 に答える 2

3

インテルのマニュアル

Intel 64 and IA-32 Architectures Software Developer's Manual - Volume 2 Instruction Set Reference - 325383-056US 2015 年 9 月の セクション「MUL - Unsigned Multiply」列 Instructionには、以下のみが含まれます。

MUL r/m8
MUL r/m8*
MUL r/m16
MUL r/m32
MUL r/m64

r/mXXはレジスタまたはメモリを意味します。そのため、( immXX) のような即値mul 2はどの形式でも使用できません。プロセッサは単にその操作をサポートしていません。

これは、2 番目の質問にも答えます。メモリで乗算することは可能です。

x: dd 0x12341234
mov eax, 2
mul dword [x]
; eax == 0x24682468

また、次のようなものが機能しない理由も示しmul al,2ています。2 つの引数を取る形式はありません。

ただし、Michael が述べたように、 には のimulような即時フォームがあり、そうでないIMUL r32, r/m32, imm32他の多くのフォームがあります。mul

于 2015-10-18T19:35:33.780 に答える