questions aux pros

Pour discuter de l'assembleur
Thierry 31
Messages : 25
Inscription : mar. 08/févr./2005 21:44
Localisation : Toulouse

questions aux pros

Message par Thierry 31 »

Code : Tout sélectionner

Procedure.s Binaire32b(decimal.l)
resultat.s=""
variable.l=13213 ; juste pour le push pop
PUSH variable 

MOV eax,[esp]
MOV ebx,[esp+4] 
MOV ecx,1
boucle: ;
CMP ecx,32
JA l_finboucle 
XOR dl,dl 
RCL eax,1
ADC dl,0 
CMP dl,0 
JE l_ajout0	
MOV byte [ebx-1+ecx], 49
JMP l_suite
ajout0:
MOV byte [ebx-1+ecx], 48
suite:
INC ecx	
JMP l_boucle
finboucle:
POP variable
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()
question 1
tant que je ne touche pas à la pile par PUSH /POP tout se passe bien, si par contre pour une raison qq je suis amené à le faire comment puis je "retomber" sur mes pieds ? peuxt'on "travailler" la valeur esp?

question 2
est'il possible pour le besoin internes d'une procedure, de crér des variables?
si oui quelle syntaxe doit'on employer?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: questions aux pros

Message par Anonyme2 »

Thierry 31 a écrit :

question 1
tant que je ne touche pas à la pile par PUSH /POP tout se passe bien, si par contre pour une raison qq je suis amené à le faire comment puis je "retomber" sur mes pieds ? peuxt'on "travailler" la valeur esp?
C'est toute la difficulté de travailler en général avec esp car esp varie sans arrêt. Si le code est court on arrive à ne pas pas avoir d'erreur de pile mais si le code devient long avec beaucoup de sauts conditionnels dont les portiions de codes peuvent faire varier esp, cela devient délicat.
Si le code devient long, il faut passer par un registre pour mémoriser (type ebp ou autre). Sinon, il faut compter les variations pour suivre esp afin de savoir si on doit ajouter ou retirer une valeur pour accéder aux variables à l'aide de esp. PureasmTools permet de générer du code asm (pour librairie) avec soit esp ou un autre registre pour accéder aux variables locales/paramètres et c'est très pratique lorsque l'on utilise des variables basées sur des structures ou interfaces. Mais il ne faut pas oublier que PB autorise que l'utilisation de eax et edx, les autres registres pouvant être utilisés par les fonctions PB (faire attention à la sauvegarde des registres) . Au début de chaque procédure, PB va sauvegarder tous les registres 32 bits (sauf eax, edx et eip) puis les restaure au retour de la procédure


Thierry 31 a écrit : question 2
est'il possible pour le besoin internes d'une procedure, de crér des variables?
si oui quelle syntaxe doit'on employer?
Si on est dans le code en basic (et pas en asm pour une librairie), pas de problème, tu déclares obligatoirement ta variable avant de l'utiliser en asm comme tu l'a fait dans ton code. Ensuite tu peux écrire des choses comme ceci (je ne sais pas si j'ai bien compris la question car tu le fait dans ton exemple)

Code : Tout sélectionner

procedure essai()
   variable.l
   MOV eax, variable  ; pas besoin de esp car c'est PB qui gère esp

Endprocedure
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Pour ce qui est des variables au sein d'une procedure, voici un code pour t'aider :

Code : Tout sélectionner

Procedure ASM(arg1.l, arg2.l) ; esp et esp+4
  Static a.l ; v_a
  var1.l = 0 ; esp+8
  ! mov eax, dword [esp] ; Met dans eax l'argument 1 (dword [esp+4*numéro d'argument])
  ! mov eax, dword [esp+4] ; Met dans eax l'argument 2
  ! mov eax, dword [s_asm.v_a] ; Met dans eax la variable static (dword [s_function.v_variable]
  ! mov eax, dword [esp+8] ; Met dans eax la variable dynamique (dword [esp+4*numéro de variable])
EndProcedure
Il a la particularité de fonctionner même si l'ASM "inline" est désactivé.
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Thierry 31
Messages : 25
Inscription : mar. 08/févr./2005 21:44
Localisation : Toulouse

Message par Thierry 31 »

je précise ma question 2: peux t'on écrire dans le corps de la procedure quelque chose comme:

Code : Tout sélectionner

! chaine DB 'texte'
ou

Code : Tout sélectionner

! intermediaire dd ?
qui ne seraient utilisées que dans la procédure, y at'il une particularité de la syntaxe Fasm?

je ne connaissais pas la technique proposée par H S, je vais expérimenter.

si j'ai bien compris en sauvegardant esp dans ebp on peut s'éviter des recalculs de esp.

merci à tous les deux

PS: je l'ai déjà écris sur le forum débutants, les Tutoriels de Denis sont super! j'ai commencé à programmer en HEXA il y a plus de 20 ans, un peu rouillé le papi :wink:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

J'ai vu ca sur le forum anglais je crois (ou ici, me rappel plus)

Code : Tout sélectionner

; extrn _MessageBoxA@16
; @16 => 4 push (x 4 = 16)

    !MB_OK equ 0
    
    !extrn _MessageBoxA@16
    
    !PUSH 0
    !PUSH l_bob
    !PUSH l_jim
    !PUSH MB_OK
    !call _MessageBoxA@16

End ;obligatoire pour call exit !!!
; section '.data' Data readable writeable
!l_bob:
; PB_DataSectionStart:
! db     "bob",0
!l_jim:
! db     "jim",0
; SYS_EndDataSection:

; DataSection
;   bob:
;     Data.s "bob"
; 
;   jim:
;     Data.s "jim"
; EndDataSection 
Répondre