我编写了一个简单的汇编函数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,这是不正确的,因为第一个“添加”设置了进位,为什么? 怎么解决这个问题?
感谢答案。
答案 0 :(得分:2)
您正在测试的数字是:
00000000ffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d2a94a2002
两者都不是负数(在64位二进制补码表示中),因此总和得到的结果。在-1
和ffffffff
中,ecx
作为64位负数将为ebx
,这会产生您最初期望的结果。
ffffffffffffffff (ecx:ebx)
000001d1a94a2003 (edx:eax) +
----------------
000001d1a94a2002
答案 1 :(得分:2)
您仍在添加正数,因为ecx:ebx(00000000FFFFFFFF)是一个正数。你需要签名扩展高dword才能工作。如果您对一个数字使用edx:eax,则可以使用 cdq 指令。