为什么设置进位标志?
问题描述:
我写了一个简单的汇编函数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,这是不正确,因为第一个 “添加” 设置进,为什么? 如何解决这个问题?
谢谢你的答案。
答
您正在测试中的数字是:
00000000ffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d2a94a2002
也不是否定的(在64位二进制补码表示),这样总结到,你得到的结果。在ecx
和ebx
中,作为64位负数的-1
将为ffffffff
,这将给出您最初期望的结果。
ffffffffffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d1a94a2002
什么是负数?输入'ecx:ebx'和'edx:eax'都不会被解释为跨两个寄存器的二进制补码64位数字分割。你是不是要测试'FFFFFFFF:FFFFFFFF'而不是'00000000:FFFFFFFF'? – 2012-01-14 11:43:28
这是正确的,我忘了,谢谢解决方案 – flatronka 2012-01-14 11:48:12
请写一个答案,我接受作为解决方案 – flatronka 2012-01-14 11:48:46