Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur
Assembleur Forum d'entraide Assembleur. Avant de poster -> F.A.Q Assembleur Tutoriels Assembleur
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 01/05/2002, 17h01   #1
Smortex
Membre Expert
 
Inscription : mai 2002
Messages : 727
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 727
Points : 1 361
Points : 1 361
Par défaut Tutoriels, F.A.Q : la rubrique Assembleur de Developpez.com

La rubrique Assembleur : http://asm.developpez.com/


Cours avancé : le décodage du jeu d'instruction x86 / x64 par Neitsa
Tutoriel Assembleur - Interfaçage avec C/C++ par Sébastien Le Ray (traduction du célèbre tutoriel du Dr Paul Carter) :
Tutoriel pour débuter en Assembleur par Benoit-M :
Programmation Assembleur sur microcontrôleur Motorola Coldfire par Joris Dedieu :
Smortex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2004, 18h04   #2
Smortex
Membre Expert
 
Inscription : mai 2002
Messages : 727
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 727
Points : 1 361
Points : 1 361
Par défaut Contribuez à la F.A.Q. Assembleur !

Bonjour a tous

La F.A.Q. Assembleur est à présent à votre disposition.

Ce n'est qu'une première version. Tout complément, toute proposition, suggestion, question-réponse supplémentaire, correctif, etc sont naturellement les bienvenus

Le but de cette F.A.Q. est de constituer une base de connaissances reposant sur des séries de Questions / Réponses (Q-R) dans différents domaines.
Pour l'instant, 2 catégories ont été retenues :
  • F.A.Q. Générale pour tout ce qui n'est pas spécifique à un système.
  • F.A.Q. x86 pour tout ce qui est uniquement faisable en assembleur x86.
D'autres catégories pourront évidemment être ajoutées en cas de besoin. De plus, les sections pourront être décomposées en sous-sections.

Comment contribuer à l'évolution de cette F.A.Q ?

Vous pouvez contribuer à la F.A.Q. en proposant à la suite de ce post des Q-R, des corrections de bugs et d'orthographe.

Quelques règles à respecter pour participer :
  • Proposez toujours une réponse avec votre question. Les questions sans réponse seront inutilisables.
  • Ne proposez pas juste un code source : accompagnez-le d'une explication (Pourquoi on fait comme ca, y a t'il des inconvénients, etc... ?).
  • Les extraits de code source doivent être courts (Et l'Assembleur a cet inconvénient que les programmes sont longs... Mettez juste l'essentiel).
  • Si vous le jugez utile, vous pouvez préciser un lien afin que le lecteur puisse approfondir le sujet.
Merci à tous pour vos contributions,
Bonne rédaction !
__________________

Smortex

Les FAQ Assembleur - Linux
In The Beginning Was The Command Line Neal Stephenson
Smortex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2007, 17h11   #3
Lunixinclar
Membre éclairé
 
Avatar de Lunixinclar
 
Inscription : juillet 2006
Messages : 415
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 415
Points : 380
Points : 380
Salut,

http://asm.developpez.com/faq/?page=fg_comp Quels sont les linkers pour l'assembleur ?
On pourrait ajouter ld.

http://asm.developpez.com/faq/?page=fx86 Qu'est-ce qu'un x86?
J'ai envie d' ajouter que le 386 amène le mode protégé tout en restant compatible avec les versions antérieures.
Lunixinclar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 19h14   #4
Neitsa
Rédacteur
 
Avatar de Neitsa
 
Homme Sébastien
Chercheur sécurité informatique
Inscription : octobre 2003
Messages : 1 041
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Chercheur sécurité informatique

Informations forums :
Inscription : octobre 2003
Messages : 1 041
Points : 1 949
Points : 1 949
Par défaut Visual Studio 2005 : Compilation Assembleur et C / C++

Bonjour,

Rien de bien transcendant dans ce post, si ce n'est la réponse à une question souvent posée:

Comment compiler et lier du C ou du C++ et de l'assembleur sous VS sans sortir de l'IDE ni utiliser d'outil externes ?

1) Ici je crée un projet console (en C)



2) Je clique sur "application settings" afin de faire un projet vide (pas de "precompiled header" ni main() non standard.)



Notez qu'on pourrait faire un autre type de projet sans problème (*.DLL, *.lib, Window, etc.). Pour la démonstration je choisis simplement un projet console :



Clique sur "finish" pour valider.

4) Dans mon explorateur de projet ("project explorer"), j'ajoute un fichier .c : clique droit sur Source file > Add > new item :



J'ajoute le fichier main.c :



Voici le code du fichier C :

Code C :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
#include <stdio.h>
 
/* fonction assembleur */
extern void* __stdcall ReverseString(char* pString, size_t StringSize);
 
int main(void)
{
	char testString[] = "Une simple phrase de test !";
	void* pReverse = NULL;
 
	pReverse = ReverseString(testString, sizeof(testString));
 
	printf("%s", (char*)pReverse);
 
	return 0;
}

Notez que la fonction assembleur est préfixée avec le mot clé "extern" (puisqu'elle est dans un module (fichier objet) externe à main.obj).
Notez aussi que la convention d'appel est en appel standard (stdcall) : cf. source assembleur où il est noté : .model flat, stdcall.

5) Toujours dans l'explorateur, j'ajoute un dossier nommé "Assembly" (clique droit sur le projet > add > new folder"). J'y met un fichier nommé main_asm.asm



Attention ! : Il ne faut pas appeler les fichier assembleur (*.asm) du même nom qu'un des fichiers C.
Par exemple main.c et main.asm. A la compilation il y aurait conflit au niveau des fichiers objets (asm.obj dans les deux cas).

Il s'agit ici d'une simple fonction de "string reverse" absolument pas optimisée. Le but ici étant de montrer que l'on peut aussi appeler des APIs avec "invoke" ainsi que des constantes (e.g MEM_COMMIT , etc.). On aurait pu aussi mettre des données, bref, tout se passe comme dans un projet MASM :

Code Assembleur :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
.686p
.model flat, stdcall
option casemap: none
 
include windows.inc
include kernel32.inc
 
.code
start:
ReverseString PROC uses edi esi, pString:DWORD, StringSize:DWORD
LOCAL buff:DWORD
 
	mov esi, pString
 
	invoke VirtualAlloc, NULL, StringSize, MEM_COMMIT, PAGE_READWRITE
	mov buff, eax
 
	mov ecx, StringSize
	mov edi, eax
	dec ecx
	add esi, ecx
	dec esi
 
boucle:
	movzx eax, byte ptr[esi]
	dec esi
	mov byte ptr[edi], al
	inc edi
	dec ecx
	jnz boucle
 
	cld
	mov esi, buff
	mov edi, pString
	mov ecx, StringSize
	rep movsb
 
	invoke VirtualFree, buff, 0, MEM_RELEASE
 
	mov eax, pString
 
	ret
 
ReverseString endp
end start

Attention ! : Veillez particulièrement à ce qu'aucune de vos fonctions, label , données, etc. ne porte le même nom que dans le code source en C / C++ (sinon il y a une possibilité de conflit lors de l'édition de lien).

6) Cliquez (clique droit) ensuite sur le projet (ou la solution peut importe) et choisissez "Custom build rules" :



7) Choisissez "MASM" (n'oubliez pas la checkbox) et faites "OK" :



8 ) Faites un clique droit sur le projet (ou la solution) et choisissez "Properties".



N.B : Notez qu'en choisissant le projet ou la solution, les paramètres qui sont appliqués vont l'être pour tous les fichiers *.asm du projet (ou de la solution). Pour appliquer des paramètres à un seul fichier faites "clique droit sur fichier > properties".

Ici on indiquera simplement le dossier des "includes" de MASM ce qui nous permettra de ne pas "hardcoder" (codé en dur) le chemin dans le fichier source :

On aura donc :

Code :
1
2
3
 
include windows.inc
include kernel32.inc
En lieu et place de :

Code :
1
2
3
 
include D:\masm32\include\windows.inc
include D:\masm32\include\kernel32.inc


Notez que les paramètres sont appliqués à la fois pour la sortie en "Release" et "Debug" ("All Configurations" entouré en rouge dans l'image).


Normalement il n'y a plus qu'a faire un F7 ("Build solution") et tout devrait bien fonctionner...

------------------------


Problèmes possibles :


- ML (compilation assembleur) ne trouve pas le dossier include des fichiers *.inc : Veillez à ce que le chemin ne termine pas par un '\'.

- Mauvais entry point : Bizarrement, il m'est arrivé parfois d'avoir l'entry point (point d'entré du programme) sur la première fonction assembleur. Si c'est le cas:

- Faites un clique droit sur le projet (explorateur de solution) puis :
- Configuration properties > Linker > advanced > entry point
- Projet console, mettez : mainCRTStartup (ou main si vous ne voulez pas du CRT)
- Projet fenêtré : winMainStartup
- DLL : DllMain (ou le nom de la procédure d'entrée de la DLL).

Il manque des options à passer à MASM :
voir les "Rule files" : http://msdn2.microsoft.com/en-us/lib...cw(VS.80).aspx

Il s'agit d'un simple fichier XML. Vous pouvez l'éditez avec la dialog box adéquate :
http://msdn2.microsoft.com/en-us/lib...zy(VS.80).aspx

L'éditeur de lien (linker) ne trouve pas les fonctions assembleurs :
- Problème complexe et très dépendant du projet....

1) Regarder la sortie de l'éditeur de lien :

- Faites un clique droit sur le projet (explorateur de solution) puis :
- Configuration properties > Linker > Command line > additional options :

mettez ceci :

Et regardez attentivement chaque ligne pour savoir ce qui cloche (les fichiers .obj sont-ils tous trouvés ?, etc.)

2) Si vous compiler du C, veillez bien à ce que le compilo soit réglé pour compiler du C...

- Faites un clique droit sur le projet (explorateur de solution) puis :
- Configuration properties > C / C++ > Advanced > compile as : (le langage utilisé !)

3) Si votre projet est en C++, il faut marquer les fonctions assembleur en "extern C" dans votre source C++, par exemple :

Code C++ :
1
2
3
4
5
6
7
8
9
10
11
 
#include <iostream>
 
extern "C" {
     /* fonction assembleur */
     extern void* __stdcall ReverseString(char* pString, size_t StringSize);
}
 
int main(void)
{
[cut]

4) Essayez de passer directement les fichiers .obj au linker :
- Faites un clique droit sur le projet (explorateur de solution) puis :
- Configuration properties > Linker > Input > additional Dependencies > :

mettez les noms des fichiers .obj. Servez vous des macros !

Et avec le switch "verbose" (cf. 1) regardez ce qu'il se passe...

----------------------

Sources et projet de démo :

ftp://ftp-developpez.com/neitsa/faq/AsmEtC.rar

-----------------------

Comment faire avec un autre assembleur que MASM ?

Il vous faut votre propre "Custom Build Rule" :

cf. http://blogs.msdn.com/devdev/archive...13/465034.aspx

Comment faire avec les versions antérieures à VS 2005 ?

Il vous faut un "Custom build step" (plus rigide que la procédure sous VS 2005) :

http://msdn2.microsoft.com/en-us/lib...0k(VS.80).aspx
Neitsa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h00.


 
 
 
 
Partenaires

Hébergement Web