comment créer une fonction "inline" ?
comment créer une fonction "inline" ?
quand on récupere la sortie asm d'une source utilisant cos par exemple, on se rend compte qu'aucune fonction PB n'est appellée, uniquement l'instruction FCOS. En gros le même principe que les fonctions inline du C qui consistent à remplacer l'appel de la fonction par son code (de facon transparente).
Maintenant, comment faire la même chose en asm ? c'est en créant le fichier .obj ? ou bien en compilant le .lib ?
Dri
Maintenant, comment faire la même chose en asm ? c'est en créant le fichier .obj ? ou bien en compilant le .lib ?
Dri
Salut mon fonctionnaire, arrête de me flatter, tu vas me faire rougir.
J espère que tu ne seras pas déçu, si je te dis que je ne porte pas de casquette en cuir, ni de casque de chantier et encore moins de casque militaire.
Pour en venir à la question du doc, je ne suis pas sur de l’avoir bien comprise.
La fonction ‘inline’ est en gros utilisée pour optimiser un programme lors de la compilation.
Or pendant la compilation d une source en assembleur, aucune modification n est faite , les instructions sont directement converties en 0 et 1 et données à bouffer au processeur.
Il n y a donc, a mon avis, pas d équivalence pour ’inline’ en asm.
J espère que tu ne seras pas déçu, si je te dis que je ne porte pas de casquette en cuir, ni de casque de chantier et encore moins de casque militaire.
Pour en venir à la question du doc, je ne suis pas sur de l’avoir bien comprise.
La fonction ‘inline’ est en gros utilisée pour optimiser un programme lors de la compilation.
Or pendant la compilation d une source en assembleur, aucune modification n est faite , les instructions sont directement converties en 0 et 1 et données à bouffer au processeur.
Il n y a donc, a mon avis, pas d équivalence pour ’inline’ en asm.
Il faut distinguer l'assembleur du langage machine.
L'assembleur, ce sont les mnémoniques à peu près compréhensibles (comme FCOS, MOV, CMP...) qui sont convertis en langage machine par un programme d'assemblage, qui a un rôle d'interprète (qu'on appelle un assembleur, avec PB sous Windows c'est FASM).
Le programme résultant est en langage machine (une suite d'octets, un ou plusieurs par instruction). L'OS le charge en mémoire, et fixe le registre PC (compteur de programme ou pointeur d'instructions) sur le premier octet. Le processeur lit les octets, et les exécute.
Suivant les programmes d'assemblage, il y a de petites différences. FASM par exemple est assez simple, et ne suit pas à la lettre les recommandations d'Intel (se reporter à la doc pour plus d'infos). Il intégre aussi des macros. Il est donc possible de faire des "pseudos instructions", qui seront remplacées au moment de l'assemblage par un code plus long.
L'assembleur, ce sont les mnémoniques à peu près compréhensibles (comme FCOS, MOV, CMP...) qui sont convertis en langage machine par un programme d'assemblage, qui a un rôle d'interprète (qu'on appelle un assembleur, avec PB sous Windows c'est FASM).
Le programme résultant est en langage machine (une suite d'octets, un ou plusieurs par instruction). L'OS le charge en mémoire, et fixe le registre PC (compteur de programme ou pointeur d'instructions) sur le premier octet. Le processeur lit les octets, et les exécute.
Suivant les programmes d'assemblage, il y a de petites différences. FASM par exemple est assez simple, et ne suit pas à la lettre les recommandations d'Intel (se reporter à la doc pour plus d'infos). Il intégre aussi des macros. Il est donc possible de faire des "pseudos instructions", qui seront remplacées au moment de l'assemblage par un code plus long.
je vais essayer de bien expliquer le shmilblick
par exemple en C, quand je crée une fonction "inline"
le compilateur remplace les appels à la fonction directement par son code
c'est adapté par exemple à une fonction "min" ou "max"
au lieu d'avoir dans son code asm
on aura
et ca c'est possible même après que la fonction aie été compilée. donc ca doit bien pouvoir se faire avec fasm nan ? (ou bien polib etc...)
Dri
par exemple en C, quand je crée une fonction "inline"
le compilateur remplace les appels à la fonction directement par son code
c'est adapté par exemple à une fonction "min" ou "max"
Code : Tout sélectionner
inline int min(int a, int b) {
return (a < b) ? a : b;
}
Code : Tout sélectionner
min:
comparer a et b
supérieur ou égal -> aller à pas_a:
mettre a dans registre
aller à fin_min:
pas_a:
mettre b dans registre
fin_min:
[...]
empiler variable2
empiler variable1
appeller min
mettre registre dans resultat
[...]
Code : Tout sélectionner
[...]
comparer variable1 et variable2
supérieur ou égal -> aller à pas_variable1:
mettre variable1 dans resultat
aller à fin_min:
pas_variable1:
mettre variable2 dans resultat
fin_min:
[...]
Dri
Avec Fasm tu n'as pas de procédures; on fait des sauts, voilà tout. De même on n'est pas obligé d'empiler les variables, on peut utiliser les registres. Pour remplacer inline, qui en gros oblige le compilo à éviter un saut et à créer le code asm en place, sans utiliser la pile, tu peux utiliser les macros, oui.
Bah par exemple regarde comment le code de la fonction Cos() est transformé par PB... Y'a pas de saut du tout.
Dri
Code : Tout sélectionner
; a.f = Cos(b.f)
FLD dword [v_b]
FCOS
FSTP dword [v_a]
Ok! J'ai enfin compris! En fait je ne pense pas que ça soit possible. Pure se comporte lui aussi comme un interpréteur; en gros il convertit le source PB en source FASM; donc pour lui tout est possible! En revanche dans une lib il n'y a que des procédures auxquelles on donne des paramètres ; cela signifie que lorsqu'on appelle ces procédures, il y a forcément un saut, plus du passage de paramètres.
Je vais quand même regarder demain
Je vais quand même regarder demain
Le compilateur PB doit avoir une "liste" de fonction "non PB" qui sont donc (+ ou -) équivalentes au "inline" du C.Dr. Dri a écrit :Bah par exemple regarde comment le code de la fonction Cos() est transformé par PB... Y'a pas de saut du tout.DriCode : Tout sélectionner
; a.f = Cos(b.f) FLD dword [v_b] FCOS FSTP dword [v_a]