为什么设置进位标志?

问题描述:

我写了一个简单的汇编函数sum64,它添加了ecx:ebx + edx:eax,它的作品正确地使用了正数,但没有使用负数。为什么设置进位标志?

sum64: 
add ebx,eax 
adc ecx,edx 
ret 

例子:

edx = 1d1h 
eax = a94a2003 
ebx = FFFFFFFF 
ecx = 00000000 

正确的结果是1D1A94A2002h但我的函数返回ECX:EBX 1d2h:a94a2002,这是不正确,因为第一个 “添加” 设置进,为什么? 如何解决这个问题?

谢谢你的答案。

+1

什么是负数?输入'ecx:ebx'和'edx:eax'都不会被解释为跨两个寄存器的二进制补码64位数字分割。你是不是要测试'FFFFFFFF:FFFFFFFF'而不是'00000000:FFFFFFFF'? – 2012-01-14 11:43:28

+0

这是正确的,我忘了,谢谢解决方案 – flatronka 2012-01-14 11:48:12

+0

请写一个答案,我接受作为解决方案 – flatronka 2012-01-14 11:48:46

您正在测试中的数字是:

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

也不是否定的(在64位二进制补码表示),这样总结到,你得到的结果。在ecxebx中,作为64位负数的-1将为ffffffff,这将给出您最初期望的结果。

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

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

+0

我试试这个,:D:D:D:D – flatronka 2012-01-14 12:18:11

+0

它也工作,谢谢。我从来没有听说过这个指令,非常有用 – flatronka 2012-01-14 12:23:09