aprés qq jours d'intenses cogitations, la lecture appronfondie des post et tutoriels du forum ASM, je suis arrivé à ça.
c'est juste l'équivalent de la fonction Bin() de pure mais en moins jolie (je n'ai pas retiré les 0 superflus).
j'ai mis en commentaires ce que j'ai compris du couple Fasm/PureBasic.
Que les pros de l'ASM se lachent, si j'écris des anneries.
je n'ai pas osé le PUSH et le POP dans mon code

Pour Denis: PureASM et PureASMtools sont un vrai régal, j'attend ton dernier tutoriel avec impatience.
Code : Tout sélectionner
Procedure.s Binaire32b(decimal.l)
resultat.s=""
; chargement de 'decimal' dans le registre eax 32 bits par la pile
; PureBasic transfère les variables au procédures via la pile par la
; méthode LIFO le registre esp pointe sur le premier élément entré, esp+4 sur le
; suivant ect, les nombres (32bits) sont chargés directement sur la pile, pour les chaines
; c'est l'adresse qui empilée.
MOV eax,[esp]
MOV ebx,[esp+4] ;chargement de l'adresse de 'resultat' dans le registre ebx
MOV ecx,1 ; mise à 1 du registre ecx qui
; sert de compteur pour la boucle de 1 à 32
boucle: ;
CMP ecx,32
JA l_finboucle ; si ecx > 32 saut vers finboucle donc la plage de 1 à 32 est bien couverte
XOR dl,dl ; mise à 0 du registre 8 bits dl
RCL eax,1 ; rotation vers la gauche d'un bit,le bit de poids le plus fort passe dans CF
ADC dl,0 ; dl <-- o + cf permet de récupérer le bit de la postion ecx (1,2...32)
CMP dl,0 ; comparaison dl et 0
JE l_ajout0 ; si dl = 0 saut vers ajout0 sinon instruction suivante
MOV byte [ebx-1+ecx], 49 ; -1 car la boucle commence à 1, 49 code ascii de 1,mettre l'octet contenant 49 à l'adresse [ebx-1+ecx]
JMP l_suite ; saut vers suite:
ajout0:
MOV byte [ebx-1+ecx], 48 ; 48 code ascii de 0
suite:
INC ecx ; incrémente ecx de 1
JMP l_boucle ; renvoie vers boucle
finboucle:
ProcedureReturn resultat
EndProcedure
OpenConsole()
PrintN ("entrez un nombre de type long: ")
valeur.l=Val(Input())
PrintN("")
PrintN(Binaire32b(valeur))
Input()
PrintN("avec la fonction pb Bin "+Bin(valeur))
Input()
CloseConsole()