[ASM] Reszta z dzielenia 64/32 bity

0

Jak w asemblerze uzyskać resztę z dzielenia liczby 64 bitowej przez 32 bitową (iloraz mnie nie interesuje).
DIVL działa tylko wtedy gdy iloraz < 2^32.

0

wynik owego działania będzie w parze EDX:EAX,w EDX starsza część wyniku ;)

0

Przepraszam, ale nie rozumiem szanownego przedmówcy.

Problem pokonany. Chyba?
Nie napisałem wcześniej czegoś, co jest istotne. 64 bity powstają w wyniku mnożenia.
Czyli chcę policzyć (A*B) % N. Można to zrobić tak: ( (A%N) * B ) % N. Wystarczy, że jeden z czynników będzie mniejszy od N, a iloraz będzie mniejszy niż 2^32. To pierwsze dzielenie można zresztą robić warunkowo.

 function mmul(a_, b_, n_:longword):longword; assembler; asm
          movl   n_,   %edi
          movl   a_,   %eax
          cmp    %eax, %edi
          jl     .A_LT_N
          xorl   %edx, %edx
          divl   %edi
          movl   %edx, %eax
.A_LT_N:
          mull   b_
          divl   %edi
          movl   %edx, %eax
end ['EDI','EDX','EAX'];  // wyniki w %eax

Czy można to zrobić lepiej? (szybciej)

0 użytkowników online, w tym zalogowanych: 0, gości: 0