web-dev-qa-db-ja.com

x86アセンブリでmulを使用して即値を乗算することは可能ですか?

DosBoxエミュレーターを使用してx86用のアセンブリを学習しています。掛け算をしようとしています。どのように機能するのかわかりません。次のコードを書くと:

mov al, 3
mul 2

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

mul, 2

al値に2を掛けますが、私には機能しません。

私が次のことを試みると:

mov al, 3
mul al,2
int 3

私は斧で結果9を取得します。説明のためにこの絵を見てください: enter image description here

別の質問:メモリロケーションを直接使用して乗算できますか?例:

mov si,100
mul [si],5
9
user2192774

即値オペランドを受け入れる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
12
Michael

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にはない形式があります。