Tutoriels, F.A.Q : la rubrique Assembleur de Developpez.com
La rubrique Assembleur : :fleche: 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 :
Contribuez à la F.A.Q. Assembleur !
Bonjour a tous :P
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 !
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)
http://neitsabes.online.fr/pic/AsmEtC/1.png
2) Je clique sur "application settings" afin de faire un projet vide (pas de "precompiled header" ni main() non standard.)
http://neitsabes.online.fr/pic/AsmEtC/2.png
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 :
http://neitsabes.online.fr/pic/AsmEtC/3.png
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 :
http://neitsabes.online.fr/pic/AsmEtC/4.png
J'ajoute le fichier main.c :
http://neitsabes.online.fr/pic/AsmEtC/5.png
Voici le code du fichier C :
Code:
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
http://neitsabes.online.fr/pic/AsmEtC/6.png
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:
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" :
http://neitsabes.online.fr/pic/AsmEtC/7.png
7) Choisissez "MASM" (n'oubliez pas la checkbox) et faites "OK" :
http://neitsabes.online.fr/pic/AsmEtC/8.png
8 ) Faites un clique droit sur le projet (ou la solution) et choisissez "Properties".
http://neitsabes.online.fr/pic/AsmEtC/9.png
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 |
http://neitsabes.online.fr/pic/AsmEtC/10.png
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 :
:arrow: - ML (compilation assembleur) ne trouve pas le dossier include des fichiers *.inc : Veillez à ce que le chemin ne termine pas par un '\'.
:arrow: - 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).
:arrow: 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
:arrow: 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:
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
-----------------------
:arrow: 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
:arrow: 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