FONCTION INTTOBIN

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- - Dernière réponse : cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
- 2 avril 2011 à 17:49
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/52837-fonction-inttobin

cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
C'est encore améliorable, par exemple, en permutant edx et ebx dans leur utilisation.

J'aurais bien retourné un pointeur vers "0",0 si l'entier = 0 sinon, pas de différence entre cette erreur et une erreur de malloc(). C'est embêtant...

@++
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
utiliser bsr et pas bsf sinon, on obtient le premier bit de poids faible à 1.
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
re zut,

IntToBin proc near
xor ecx,ecx
xor eax,eax
mov edx,[esp+4]
bsf ecx,edx ; ecx = index base zero du premier bit de poid fort à 1.
push ebx
je err ; si edx = 0 -> err
push edx
add ecx,2 ; ecx = n bits à allouer + 1 pour zero terminal
push ecx
call malloc
and eax,eax
pop ecx
pop edx
je err ; malloc retourne un pointeur NULL
dec ecx; retour sur index
mov [eax+ecx],0
dec ecx
@1:
xor bl,bl
shr edx,1
adc bl,'0'
mov [eax+ecx],bl
dec ecx
jns @1
err:
pop ebx
ret
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
!!! remplacer jns @1 par jne @1
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
salut,

Utilisation du registre ebx sans sauvegarde/restauration, c'est très dangereux.
Pas de sauvegarde/restauration du registre ecx avant et après le malloc, prions que la fonction ne le modifie pas.

IntToBin proc near
xor ecx,ecx
xor eax,eax
mov edx,[esp+4]
bsf ecx,edx ; ecx = index base zero du premier bit de poid fort à 1.
push ebx
je err ; si edx = 0 -> err
push edx
add ecx,2 ; ecx = n bits à allouer + 1 pour zero terminal
push ecx
call malloc
and eax,eax
pop ecx
pop edx
je err ; malloc retourne un pointeur NULL
mov [eax+ecx],0
dec ecx
@1:
xor bl,bl
shr edx,1
adc bl,'0'
mov [eax+ecx],bl
dec ecx
jns @1
err:
pop ebx
ret

@++