如果这两个字节的总和超过一个字节,我如何在Assembly中添加两个字节



我正在大学学习汇编语言,我很确定我什么都不懂,尤其是因为课程是在线的。

这可能是一个非常简单的问题,但我仍然不知道答案。假设我想把我存储为字节a = 255b = 255的两个数字相加。我认为如果我们这样做,这是行不通的:

segment data use32 class=data
a db 255
b db 255
segment code use32 class=code
start:

mov al, [a]
add al, [b]

由于和是510,它不能存储在AL中,因为AL是一个1字节大小的寄存器,对吧?我在NASM上试过这个(我几乎不知道如何使用它(,但我不认为我得到了正确的答案。EAX寄存器在0019FFFE的末尾看起来是这样的,hexa中的510是1FE,所以我想我应该在某个地方看到1FE,但我们没有!

所以我想这不是正确的方式。然后我想也许我可以用AX来做加法。所以我做了这样的事情:

segment data use32 class=data
a db 255
b db 255
segment code use32 class=code
start:
mov ax, word 0
mov al, [a]
add al, [b]

我认为,如果我们将AX初始化为0,然后向AL添加一些东西,结果将超过一个字节,结果将通过AX传播,我们就会得到正确的答案。但我最后得到了001900FE,所以再次没有1FE的痕迹。

那么我应该如何将这两个值相加呢?如果这是一个愚蠢的问题,我很抱歉,但我真的很困惑。我在课堂上几乎什么都没保留,关于Assembly,互联网上的信息来源也很少,所以我没有在网上找到我问题的答案。

如果您还没有使用处理器处理的最大大小,那么您可以增加一个大小。

以16位为单位进行加法运算。处理器通常不支持在16位答案中添加8位值,但您可以将8位值提升为16位,然后进行16位加法。

要扩展到16位,可以将一个值加载到al中,然后清除ah,因此现在ax保存一个16位值。在bl/bh/bx或cl/ch/cx中执行同样的操作,然后可以将这两个16位值相加。这是假设您的输入是无符号字节。(如果它们是有符号的字节,您可以使用符号扩展操作来提升到16位。(您也可以先清除ax,然后加载到al中,在ax中会有一个16位的零扩展值。

如果你也在尝试这样做,但你已经使用了处理器的最大大小,比如32位,你会在加法后检查进位标志,它会告诉你加法是否溢出(这意味着它适合32位(。

顺便说一句,进位标志也是通过进行8位加法来设置的,所以你也可以检查一下结果是否大于8位。

通常,将两个n位值相加会产生n+1位的答案,而将两个n位值相乘会产生2n位的答案。在x86上,进位标志被用作额外的位,乘法指令被用于提供更大的答案。

相关内容

  • 没有找到相关文章

最新更新