2015-01-11 1 views
0

, поэтому у меня есть некоторые странные результаты при попытке разделить 32-битную на 32-битную.Неточный результат при mul'ing

mov eax, [bignum] 
call writedec 
call crlf 

mul ebx    ;EDX:EAX = EAX*EBX 
mov [bignum], eax ;save result 
call writedec 
call crlf 

mov eax, edx 
call writedec 
call crlf 
mov ecx, edx   ;save carried part in ECX 

это печатает:

479001600 

1932053504 

1 

Когда EBX является 13.

Как это могло случиться? Я потерян.

+0

Что вы думаете об ошибке? –

+0

Результаты ...? Из-за вызовов writedec и ebx вы можете видеть, что не так. – user3885166

+0

Нет, я не могу. Это те результаты, которых я ожидал бы. –

ответ

3

479001600 * 13 = 6227020800, или, 0x17328CC00 в гексагоне. Это слишком велико для 32 бит.

1 * 0x100000000 = 0x100000000

0x17328CC00-0x100000000 = 0x7328CC00 или 1932053504 в десятичной системе.

Итак, новостей здесь нет.

Иными словами, ваши результаты 1 в EDX и 1932053504 в EAX.

EDX содержит 32 бит результата более высокого порядка, поэтому умножьте на 2^32, т.е. 0x100000000:

1 * 0x100000000 = 0x100000000

EDX содержит младшие 32 бита результата:

0x7328CC00

добавить их вместе, чтобы получить все 64 бита результата:

0x100000000 + 0x7328CC00

0x17328CC00 в десятичной форме - 6227020800 QED.

+0

Да, это слишком большое значение для 32 бит, но mul сохраняет результаты в 64 бит - 32 бит edx и 32 бит eax, поэтому почему бы Это работает? Как еще я могу реализовать умножение больших чисел, если не так? – user3885166

+1

Это действительно работает! EDX 1 - правильный. EAX - 1932053504 - также правильно. –

+0

Упс! Поскользнулся на 100000000. Отредактировал его. –

 Смежные вопросы

  • Нет связанных вопросов^_^