Зачем устанавливать флаг переноса? - PullRequest
1 голос
/ 14 января 2012

Я пишу простую функцию ассемблера 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 ]

2 голосов
/ 14 января 2012

Вы все еще добавляете положительные числа, потому что ecx: ebx (00000000FFFFFFFF) является положительным числом. Чтобы это сработало, вам нужно подписать-расширить верхнюю мечту. Если вы используете edx: eax для одного номера, вы можете использовать для этого инструкцию cdq .

2 голосов
/ 14 января 2012

Номера, которые вы тестируете:

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

Ни один из них не является отрицательным (в представлении дополнения 64-битной двоичной кодировки), поэтому суммируйте полученный результат. -1 как 64-битное отрицательное число будет равно ffffffff как ecx, так и ebx, что даст результат, который вы изначально ожидали.

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