为什么设置进位标志?

时间:2012-01-14 11:40:01

标签: 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,这是不正确的,因为第一个“添加”设置了进位,为什么? 怎么解决这个问题?

感谢答案。

2 个答案:

答案 0 :(得分:2)

您正在测试的数字是:

00000000ffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d2a94a2002

两者都不是负数(在64位二进制补码表示中),因此总和得到的结果。在-1ffffffff中,ecx作为64位负数将为ebx,这会产生您最初期望的结果。

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

答案 1 :(得分:2)

您仍在添加正数,因为ecx:ebx(00000000FFFFFFFF)是一个正数。你需要签名扩展高dword才能工作。如果您对一个数字使用edx:eax,则可以使用 cdq 指令。