MULTIPLIER POUR DIVISER, NOMBRES MAGIQUES

Signaler
Messages postés
551
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
-
ToutEnMasm
Messages postés
551
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
-
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

ToutEnMasm
Messages postés
551
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
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
ToutEnMasm
Messages postés
551
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
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
;-------------------------------------------------------------
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
17
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 ?
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
17
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.