pour ceux qui se battent avec l'assembleur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Thierry 31
Messages : 25
Inscription : mar. 08/févr./2005 21:44
Localisation : Toulouse

pour ceux qui se battent avec l'assembleur

Message par Thierry 31 »

je m'y suis remis aprés plus de 20 ans d'interruption, dans ce temps là on programmait en héxa, ça se fait encore mais il faut prévoir l'aspirine!
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 :oops:
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()