【发布时间】:2020-10-11 17:08:10
【问题描述】:
我正在拼贴学习汇编语言,我很确定我什么都不懂,尤其是因为课程是在线的。
这可能是一个非常简单的问题,但我仍然不知道答案。假设我想添加两个存储为字节a = 255 和b = 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的踪迹。
那么我应该如何添加这两个值呢?如果这是一个愚蠢的问题,我很抱歉,但我真的很困惑。我几乎没有保留课堂上的任何内容,而且关于组装,互联网上的资源非常稀缺,所以我并没有真正在网上找到我的问题的答案。
【问题讨论】:
-
你添加到
al,这只是eax的最低8位。高位不受指令影响。是的,这是今天没有人想要的 x86 的一个可怕的错误功能,它的起源可以追溯到 x86 的 8 位前身(8008/8080/8085),因为即使在那时英特尔也很感激他们全新处理器的兼容性设计。如果你想加宽,你可以先加载到一个寄存器中,然后添加整个(16 位或 32 位)寄存器。