Télécharger le zip
mov byte ptr[eax + ecx-1], '0'shr edx, 1adc byte ptr[eax + ecx-1], 0NON !!! 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.
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 nearxor ecx,ecxxor eax,eaxmov edx,[esp+4]bsf ecx,edx ; ecx = index base zero du premier bit de poid fort à 1.push ebxje err ; si edx = 0 -> errpush edxadd ecx,2 ; ecx = n bits à allouer + 1 pour zero terminalpush ecxcall mallocand eax,eaxpop ecxpop edxje err ; malloc retourne un pointeur NULLmov [eax+ecx],0dec ecx@1:xor bl,blshr edx,1adc bl,'0'mov [eax+ecx],bldec ecxjns @1err:pop ebxret@++
!!! remplacer jns @1 par jne @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 NULLdec ecx; retour sur indexmov [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
utiliser bsr et pas bsf sinon, on obtient le premier bit de poids faible à 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...@++
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte
1 902 592 membres 19 nouveaux aujourd'hui 16 193 membres club