IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

Tutoriels, F.A.Q : la rubrique Assembleur de Developpez.com


Sujet :

Assembleur

  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 930
    Points : 59 399
    Points
    59 399
    Billets dans le blog
    2
    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 :
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    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

  3. #3
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    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.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    include windows.inc
    include kernel32.inc
    En lieu et place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Réponses: 136
    Dernier message: 23/08/2021, 11h08
  2. Nouvelle série de tutoriels sur Project Anarchy disponible en français sur Developpez.com
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 11/10/2013, 21h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo