DosBoxエミュレーターを使用してx86用のアセンブリを学習しています。掛け算をしようとしています。どのように機能するのかわかりません。次のコードを書くと:
mov al, 3
mul 2
エラーが発生します。私が使用しているリファレンスでは乗算で述べていますが、AXは常にプレースホルダーであると想定しているため、次のように記述します。
mul, 2
al
値に2を掛けますが、私には機能しません。
私が次のことを試みると:
mov al, 3
mul al,2
int 3
私は斧で結果9を取得します。説明のためにこの絵を見てください:
別の質問:メモリロケーションを直接使用して乗算できますか?例:
mov si,100
mul [si],5
即値オペランドを受け入れるMUL
の形式はありません。
次のいずれかを実行します。
mov al,3
mov bl,2
mul bl ; the product is in ax
または:
mov ax,3
imul ax,2 ; imul is for signed multiplication, but that doesn't matter here
; the product is in ax
または:
mov al,3
add al,al ; same thing as multiplying by 2
または:
mov al,3
shl al,1 ; same thing as multiplying by 2
Intelマニュアル
Intel 64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル-第2巻命令セットリファレンス-325383-056US 2015年9月 セクション「MUL-符号なし乗算」列Instruction
には以下のみが含まれます:
MUL r/m8
MUL r/m8*
MUL r/m16
MUL r/m32
MUL r/m64
r/mXX
は、レジスタまたはメモリを意味します。したがって、mul 2
のような即値(immXX
)は、どの形式でも許可されていません。プロセッサは、単にその操作をサポートしていません。
これは2番目の質問にも答えます。メモリを乗算することは可能です。
x: dd 0x12341234
mov eax, 2
mul dword [x]
; eax == 0x24682468
また、mul al,2
などが機能しない理由も示しています。2つの引数を取るフォームはありません。
ただし、Michaelが述べたように、imul
にはIMUL r32, r/m32, imm32
のような即時形式があり、他の多くのmul
にはない形式があります。