2012-01-14 85 views
1

我寫了一個簡單的彙編函數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

回答

2

您正在測試中的數字是:

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

也不是否定的(在64位二進制補碼錶示),這樣總結到,你得到的結果。在ecxebx中,作爲64位負數的-1將爲ffffffff,這將給出您最初期望的結果。

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

您仍在添加正數,因爲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

相關問題