在 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
。
Explanation:
If ax = 100h
, then al = 00h
. Since the result of mul cl
is placed in ax
, what you do is basically to replace the content of ax
with 00h*cl
, which is 00h
.
Opcode MUL
CPU: i8086+ Type of Instruction: User
Affected FLags: CF, OF, AF, PF, SF, ZF
Instruction: 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