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
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)