在x86 16位程序集上,如果1
中有ax
且0x10
中有16
(cl
),则以下代码不会将0x1000
放入cl
:
mul cl ; ax = 0x 10
mul cl ; ax = 0x 100
mul cl ; ax = 0x0000 (not 0x1000)
为什么这段代码没有按预期工作?
答案 0 :(得分:6)
您的源是8位(cl
),因此乘法仅在al
上执行。
改为使用mul cx
。
<强>说明:强>
如果是ax = 100h
,那么al = 00h
。由于mul cl
的结果放在ax
中,您所做的基本上是将ax
的内容替换为00h*cl
00h
。
操作码MUL
CPU:i8086 +指令类型:用户
受影响的FLags:CF,OF,AF,PF,SF,ZF
说明:MUL src
注意:源的累加器的无符号乘法。 如果“src”是 一个字节值,然后AL用作另一个被乘数和结果 放在AX中。如果“src”是一个字值,则AX乘以 “src”和DX:AX接收结果。如果“src”是双字值, 然后EAX乘以“src”和EDX:EAX接收结果。该 386+使用早期的algorythm,这使得任何大小的倍增 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