我编写一个代码来乘以两个8位十六进制数并应用shift和add方法。我在名为" a"的变量中取了两个输入。和" b"它们是字节类型并将它们存储在al和bl中。
在乘法过程中,al向左移动,bl向右移动。 后来,在循环中,我添加了带有dx寄存器的ax(a)(初始化为0)。 但是,问题是当shl ax,1 被替换为 shl al,1然后我没有得到所需的输出。 ie - a = 12和b = 10然后只有20个被打印而不是120.
请解释一下,为什么我不能写,1。
这是代码
{{1}}
答案 0 :(得分:2)
如果您在al
中有一个8位值并且想要将其向左移动然后添加到dx
,则需要向左移ax
,否则会丢失掉被乘数。换句话说,您希望继续向左移动,保留所有位,并在每次看到乘数中的1时添加到中间结果。
shl al,1
根本不会影响ah
。它只影响ah
。这就是你需要shl ax,1
的原因。由于shl al,1
转移
这是一个例子。最初:
al = 01011001
ax = 0000000001011001
bl = 00010111
dx = 0000000000000000
右移bl
并获得1位,左移al
。我们从bl
班次得到1位,因此将ax
添加到dx
:
al = 10110010
ax = 0000000010110010
bl = 00001011
dx = 0000000010110010
右移bl
并获得1位,左移al
。我们从bl
班次得到1位,因此将ax
添加到dx
:
al = 01100100
ax = 0000000001100100 <-- wrong! result of shifting al
bl = 00000101
dx = 0000000100010110 <-- wrong because ax was wrong
哦,麻烦。 ax
现在错了。我们丢失了从al
左移的位。
这就是我们想要的:
al = 01100100
ax = 0000000101100100 <-- This is what we want, result of shifting ax
bl = 00000101
dx = 0000001000010110 <-- This is what we want, from correct ax
如果查看documentation for shl
,您会发现al
的高位被shl al,1
指令移入CF(进位标志)。如果您希望使用“旋转进位”,则可以将该位旋转到ah
:
shl al,1
rcl ah,1
但是你可以使用一条指令获得你想要的结果:
shl ax,1