x86 16 ビット アセンブリでは、1
inax
および0x10
( 16
) in がある場合、次のコードはをcl
挿入しません。0x1000
cl
mul cl ; ax = 0x 10
mul cl ; ax = 0x 100
mul cl ; ax = 0x0000 (not 0x1000)
このコードが期待どおりに機能しないのはなぜですか?
ソースは 8 ビット ( cl
) であるため、乗算はオーバーal
のみで実行されます。
mul cx
代わりに使用してください。
説明:の
場合ax = 100h
、al = 00h
. の結果mul cl
は に置かれるので、ax
基本的には の内容を に置き換えるax
だけ00h*cl
です00h
。
オペコード MUL
CPU: i8086+ 命令の種類: ユーザー
影響を受けるフラグ: CF、OF、AF、PF、SF、ZF
命令: MUL src
注: ソースによるアキュムレータの符号なし乗算。「src」がバイト値の場合、AL が他の被乗数として使用され、結果が AX に配置されます。「src」がワード値の場合、AX に「src」が乗算され、DX:AX が結果を受け取ります。「src」がダブルワード値の場合、EAX に「src」が乗算され、EDX:EAX が結果を受け取ります。386+ は、EAX の任意のサイズ値を 8 または 16 ビット レジスタと同じくらい高速に乗算するアーリー アウト アルゴリズムを使用します。
++++++++++++++++++++++++++++++++++++++
クロック (i486): MUL reg8 13-18 MUL reg16 13-26 MUL reg32 13-42 MUL mem8 13-18 MUL mem16 13-26 MUL mem32 13-42