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

How can I add two bytes in Assembly if the sum of these two bytes exceeds a byte?

我正在拼贴学习汇编语言,我很确定我什么都不懂,尤其是 classes 在线。

这可能是一个非常简单的问题,但我仍然不知道答案。假设我想添加两个存储为字节 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 末尾看起来像这样,而 6 进制的 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.

的踪迹

那么我应该如何将这两个值相加呢?如果这是一个愚蠢的问题,我很抱歉,但我真的很困惑。我几乎没有从 class 中保留任何东西,而且互联网上关于组装的资源非常稀缺,所以我并没有真正在网上找到我的问题的答案。

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

改用 16 位进行加法。处理器通常不支持将 8 位值加到 16 位答案中,但您可以将 8 位值提升为 16 位,然后进行 16 位加法。

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

中的零扩展值

如果你想做同样的事情,但你已经使用了处理器的最大尺寸,比如 32 位,你会在加法后检查进位标志,它会告诉你是否加法溢出或未溢出(这意味着它适合 32 位)。

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

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