Assembly 为什么设置携带标志?

Assembly 为什么设置携带标志?,assembly,nasm,Assembly,Nasm,我编写了一个简单的汇编函数sum64,它添加了ecx:ebx+edx:eax,它的工作方式是正数,但不是负数 sum64: add ebx,eax adc ecx,edx ret 例如: edx = 1d1h eax = a94a2003 ebx = FFFFFFFF ecx = 00000000 正确的结果是1D1A94A2002h,但我的函数返回ecx:1d2h ebx:a94a2002,这是不正确的,因为第一个“添加”设置进位,为什么? 如何解决这个问题 谢谢您的回答。您正在测试的数字

我编写了一个简单的汇编函数sum64,它添加了ecx:ebx+edx:eax,它的工作方式是正数,但不是负数

sum64:
add ebx,eax
adc ecx,edx
ret
例如:

edx = 1d1h
eax = a94a2003
ebx = FFFFFFFF
ecx = 00000000
正确的结果是1D1A94A2002h,但我的函数返回ecx:1d2h ebx:a94a2002,这是不正确的,因为第一个“添加”设置进位,为什么? 如何解决这个问题


谢谢您的回答。

您正在测试的数字是:

00000000ffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d2a94a2002
两者都不是负数(在64位2的补码表示中),所以求和得到的结果
-1
作为64位负数,在
ecx
ebx
中都是
ffffffff
,这将给出您最初期望的结果

ffffffffffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d1a94a2002

您正在测试的数字是:

00000000ffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d2a94a2002
两者都不是负数(在64位2的补码表示中),所以求和得到的结果
-1
作为64位负数,在
ecx
ebx
中都是
ffffffff
,这将给出您最初期望的结果

ffffffffffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d1a94a2002

您仍然在添加正数,因为ecx:ebx(00000000FFFFFFFF)是正数。您需要签署扩展高dword才能使其生效。如果使用edx:eax表示一个数字,则可以使用cdq指令进行此操作。

您仍然在添加正数,因为ecx:ebx(00000000 FFFFFFFF)是正数。您需要签署扩展高dword才能使其生效。如果您使用edx:eax表示一个数字,您可以使用cdq的说明来表示这个数字。

什么负数?输入的
ecx:ebx
edx:eax
都不是负值,被解释为两个寄存器之间分割的两个补码64位数字。你的意思是测试
FFFFFFFF:FFFFFFFF
而不是
00000000:FFFFFFFF
?这是正确的,我忘了,谢谢解决方案请写一个答案,我接受作为解决方案在一般情况下,加法和减法不受数字的两个补码的影响,逻辑不知道也不关心。乘和除不重要,不是加和减。什么负数?输入的
ecx:ebx
edx:eax
都不是负值,被解释为两个寄存器之间分割的两个补码64位数字。你的意思是测试
FFFFFFFF:FFFFFFFF
而不是
00000000:FFFFFFFF
?这是正确的,我忘了,谢谢解决方案请写一个答案,我接受作为解决方案在一般情况下,加法和减法不受数字的两个补码的影响,逻辑不知道也不关心。乘法和除法都很重要,不是加减法。它也很有效,谢谢。我从来没有听过这个指令,非常有用。它也起作用了,谢谢。我从没听过这个指令,非常有用