MULTIPLIER POUR DIVISER, NOMBRES MAGIQUES

Signaler
Messages postés
589
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
17 septembre 2021
-
Messages postés
589
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
17 septembre 2021
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54635-multiplier-pour-diviser-nombres-magiques

Messages postés
589
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
17 septembre 2021
3
La réponse est içi avec le code source.
http://win32assembly.programminghorizon.com/files/magicnumber.zip.
Même résultat que le code de brunews et la même limitation a des nombres de 29 bits,a cause du décalage de trois.
Max:1fffffffh
Messages postés
589
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
17 septembre 2021
3
citation:
Si on veut vraiment coder obsolete, il reste a transposer "div r10" de bnRecidivDW(), c'est quand meme pas la mer à boire pour un codeur ASM.

Voici donc le code:
; void bnRecidivDW(ECX DWORD v, RDX LPBNRECIDIV prcdvs)
ALIGN 16
bnRecidivDW PROC
mov r10d, ecx
mov r9, rdx ; R9 = prcdvs
xor ecx, ecx ; pour result coherent de BSR
lea r8d, [r10d - 1]

bsr ecx, r10d
test r8d, r10d
mov [r9 + 8], ecx ; prcdvs->decSHR IMPEC
mov eax, 1
je short POWEROF2
shl eax, cl

shl rax, 32
xor edx, edx
div r10

add eax, 1
xor ecx, ecx ; NON pow2
mov [r9], eax ; prcdvs->loMagic
POWEROF2:
mov [r9 + 12], ecx
ret 0
bnRecidivDW ENDP

;-------------------------------------------------------------
SANS COMMENTAIRES
;-------------------------------------------------------------
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
mais enfin, on n'est pas sur telecharger.com, je donne l'algo et travaille qui veut.

Je tape 13 en zone DWORD, prog donne:
mov eax, dividend
mov ecx, -1651910498
mul ecx
shr edx, 3
EDX = RESULT

C'est pas du 32 bits ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Clair que le soft est en x64, nous sommes fin 2012.

Tu ne vois pas que la zone DWORD fait le 32 bits ?

Si on veut vraiment coder obsolete, il reste a transposer "div r10" de bnRecidivDW(), c'est quand meme pas la mer à boire pour un codeur ASM.
Afficher les 13 commentaires