由于代码NASM 64位编程中的al和ax上的shl输出错误

时间:2018-04-14 19:17:36

标签: assembly nasm x86-64

我编写一个代码来乘以两个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}}

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