Aller au contenu
San Andreas Multiplayer
C_far

L'assembleur (#emit) - Partie 1

Messages recommandés

Salut.
 
Super tuto! #EMIT était pour moi un sujet mistique très intéressant. J'ai donc des questions!
» Data, Code, Stack, Heap sont ils dans le registre primaire ?
» Les deux registres sont exécutés sur la "machine virtuelle"?
Pour ce qui est des codes ou autres j'ai bien compris et saisi la chose mais ça m'amène à d'autres questions.
» Coder en "#emit" donne des performances améliorées ?! (rapidité d'exécution). Je demande ça car je vois que tu as quand même réduits de 6 p-codes et si j'ai bien saisi, les p-codes sont "générés" par le compiler puis lus par la machine virtuelle .
Merci de tes réponses.
PS: Ces questions peuvent te paraître très simplistes et un peu stupides mais c'est la première fois que je touche de la programmation à ce niveau.
Modifié par Dayrion

Partager ce message


Lien à poster
Partager sur d’autres sites

» Data, Code, Stack, Heap sont ils dans le registre primaire ?

Le registre primaire et le registre alterné sont des segments temporaires.

Les segments DATA, COD, STK et HEAP sont dynamiques et statiques à la fois, disons qu'il faut comprendre comment fonctionne l'Architecture de von Neumann.

 

» Les deux registres sont exécutés sur la "machine virtuelle"?

Les deux registres qui sont des segments temporaires sont utilisées lors de l’exécution du code, donc dans l'Abstract Machine.

 

» Coder en "#emit" donne des performances améliorées ?! (rapidité d'exécution). Je demande ça car je vois que tu as quand même réduits de 6 p-codes et si j'ai bien saisi, les p-codes sont "générés" par le compiler puis lus par la machine virtuelle 

Oui en diminuant le nombre de p-code, on permet une exécution plus rapide du code, mais sache que 6 p-codes c'est rien, c'était juste un exemple.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Dutheil il est amoureux de l'assembleur, chaque instant de sa vie où il voit un nouveau topic de demande d'aide se transforme en l'espoir, brillant dans ses yeux qu'il va pouvoir utiliser #emit,

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 9 minutes, IncroyablePix a dit :

Dutheil il est amoureux de l'assembleur, chaque instant de sa vie où il voit un nouveau topic de demande d'aide se transforme en l'espoir, brillant dans ses yeux qu'il va pouvoir utiliser #emit,

 

Et après y'a ceux qui pense que la lisibilité du code est plus importante que l'optimisation (obviously y'a des limites) :rolleyes:

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 7 minutes, Papawy a dit :

 

Et après y'a ceux qui pense que la lisibilité du code est plus importante que l'optimisation (obviously y'a des limites) :rolleyes:

J'aime quand un code est propre et optimisé !

A la limite en C(++), l'optimisation peut passer après si c'est un petit programme. Mais en Pawn, c'est autre chose, car les collisions de pointeurs arrivent vite !

Partager ce message


Lien à poster
Partager sur d’autres sites
à l’instant, Dutheil a dit :

J'aime quand un code est propre et optimisé !

A la limite en C(++), l'optimisation peut passer après si c'est un petit programme. Mais en Pawn, c'est autre chose, car les collisions de pointeurs arrivent vite !

 

Tiens d'ailleurs, ce soir (oui j'ai une épreuve de bac cet aprem) faudra que j'te parle d'un "soucis" que j'ai eu avec des problèmes du type "comment je peux renvoyer l'adresse de cette variable et pas une copie ?". Type de problème auxquels je n'avais pas été confronté en C++ ou en Python (ou tout est référence).

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 2 minutes, Papawy a dit :

 

Tiens d'ailleurs, ce soir (oui j'ai une épreuve de bac cet aprem) faudra que j'te parle d'un "soucis" que j'ai eu avec des problèmes du type "comment je peux renvoyer l'adresse de cette variable et pas une copie ?". Type de problème auxquels je n'avais pas été confronté en C++ ou en Python (ou tout est référence).

Ca ?

int i = 0;
int *pi;
pi = &i;

 

Partager ce message


Lien à poster
Partager sur d’autres sites
static MySQL_handle;

// ----------------------------------------------------------------------------

stock getMySQLHandle()
{
	return MySQL_handle;
}

stock setMySQLHandle(newHandle)
{
	MySQL_handle = newHandle;
	return true;
}

En C/++ j'aurais pu retourner un pointeur dans "getMySQLHandle" et donc ça m'aurais éviter le "setMySQLHandle" inutile à mes yeux.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 44 minutes, Papawy a dit :

static MySQL_handle;

// ----------------------------------------------------------------------------

stock getMySQLHandle()
{
	return MySQL_handle;
}

stock setMySQLHandle(newHandle)
{
	MySQL_handle = newHandle;
	return true;
}

En C/++ j'aurais pu retourner un pointeur dans "getMySQLHandle" et donc ça m'aurais éviter le "setMySQLHandle" inutile à mes yeux.

Garde ce genre de méthodes, que ça soit en C/C++/Pawn, c'est + universel

Partager ce message


Lien à poster
Partager sur d’autres sites
#include <a_samp>

main()
{
	new a;
	#emit LOAD.S.pri a
	#emit ADD.S.pri 10
	#emit LOAD.S.pri a
	printf("%i", a);
}
// OU
main()
{
	new a;
	#emit LOAD.S.pri a
	#emit ADD.S 10
	#emit LOAD.S.pri a
	printf("%i", a);
}

Ce code me renvoi :

Run time error 22: "AMX not initialized (or doubly initialized)"

Le problème vient de la ligne de l'addition. @C_far

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 5 minutes, Dayrion a dit :

#include <a_samp>

main()
{
	new a;
	#emit LOAD.S.pri a
	#emit ADD.S.pri 10
	#emit LOAD.S.pri a
	printf("%i", a);
}
// OU
main()
{
	new a;
	#emit LOAD.S.pri a
	#emit ADD.S 10
	#emit LOAD.S.pri a
	printf("%i", a);
}

Ce code me renvoi :


Run time error 22: "AMX not initialized (or doubly initialized)"

 

Le problème vient de la ligne de l'addition. @C_far

C'est normal, je vois ce que tu souhaites faire, additionner la valeur 10 à la variable "a".

Pour il faut simplement charger la valeur "a", on constate qu'elle se trouve dans le stack puisqu'elle est dans uen fonction et qu'elle n'est pas statique, donc LOAD.S.(pri/alt).

 

ADD.S.pri/ADD.S n'existe pas, c'est ADD ou ADD.C.

ADD permet d'additionner le contenu du registre alterné au registre primaire (pri += alt)

ADD.C ajoute la valeur en paramètre au registre primaire (ADD.C 5 = pri += 5)

 

Pour stocker la valeur d'un registre temporaire dans une variable, il faut utiliser STOR.S.(pri/alt)

 

 

Modifié par C_far

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah oui, pas foutus de recopier les bonnes réponses..

(A la fin j'ai voulus faire le code globale avec #emit, ça a fonctionné en regardant la solution j'ai vus qu'il y avait 100x plus simple avec #emit CONST.alt 10 dès le début. )

 

Edit; Que signifie .c et .s (STACK non?) ? Tu as pas parlés de substrate (SUB) dans le tuto mais tu l'inclus en solution de fin! :) @C_far

Modifié par Dayrion

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 38 minutes, Dayrion a dit :

Ah oui, pas foutus de recopier les bonnes réponses..

(A la fin j'ai voulus faire le code globale avec #emit, ça a fonctionné en regardant la solution j'ai vus qu'il y avait 100x plus simple avec #emit CONST.alt 10 dès le début. )

 

Edit; Que signifie .c et .s (STACK non?) ? Tu as pas parlés de substrate (SUB) dans le tuto mais tu l'inclus en solution de fin! :) @C_far

.C = constante

.S = stack

 

SUB permet de soustraire tout simplement (pri -= alt)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci à @maxia de m'avoir fait remarquer une erreur de ma part dans ce tutoriel (je m'étais pas relu), dans deux codes j'ai utilisé deux fois LOAD.S.pri à la place d'une fois et d'un STOR.S.pri :P 

@Dayrion voilà pourquoi tu avais fait une erreur

Modifié par C_far
  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×