FONCTION INTTOBIN

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 févr. 2011 à 09:23
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 2
2 avril 2011 à 17:49
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 2
2 avril 2011 à 16:55
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 2
2 avril 2011 à 16:47
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 2
2 avril 2011 à 16:41
!!! 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 2
2 avril 2011 à 16:34
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

@++
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 févr. 2011 à 09:23
mov byte ptr[eax + ecx-1], '0'
shr edx, 1
adc byte ptr[eax + ecx-1], 0

NON !!! on ne réécrit pas 2 fois en mémoire le meme octet. Il y a des registres et il convient de s'en servir.
Quand on met une fonction en ASM c'est qu'on va faire mieux que le compilo C sinon on s'abstient.