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

x86 32-bits / 64-bits Assembleur Discussion :

[Visual Studio 2008] Asm et C/C++ dans un seul fichier


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Par défaut [Visual Studio 2008] Asm et C/C++ dans un seul fichier
    Bonjour.

    Actuellement je me casse la tête avec l'Assembleur.
    Je veux inclure mon code Assembleur dans ma source C ou C++

    Exemple :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    include <stdio.h>
     
    ma_fonctionassembleur()
    {
    }
     
    int main()
    {
    ma_fonctionassembleur();
     
    return 0;
    }
    Sachez que je ne sais que faire bouger les variables pour le moment, mais j'aimerais les voir dans ma printf ou quelque chose comme ça, est-ce que c'est possible ?

    J'utilise visual studio 2008.

    merci avance

  2. #2
    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
    Par défaut
    Bonjour,

    un exemple simple avec un strlen() en assembleur (code minimal sans gestion de cas spéciaux ou d'erreurs):

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <stdio.h>
    #include <stdlib.h>
     
    size_t my_strlen(char * string)
    {
    	size_t result;
    	__asm{
    		push ecx
    		push edi
     
    		xor ecx, ecx
    		xor eax, eax
    		dec ecx
    		mov edi, string
    		repne scasb
    		inc ecx
    		not ecx
    		mov result, ecx
     
    		pop edi
    		pop ecx
    	}
     
    	return result;
    }
     
    int main(void)
    {
    	char test[] = "une phrase de test";
    	size_t res;
     
    	res = my_strlen(test);
    	printf("Longueur de la chaine: %u", res);
     
    	return 0;
    }

    Sous VS 2008, il faut donc utiliser le mot clé __asm. Ceci n'est possible qu'en 32 bits, pour le 64 bits il faut utiliser la compilation séparée...

    D'une manière générale tous les mots clés de MASM sont utilisables dans un code assembleur sous VS 2008.

    Pour la compilation séparée, tu peux regarder à ce post.

  3. #3
    Membre très actif
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Par défaut
    j'ai suis ton ancien exemple dans le forum, http://www.developpez.net/forums/d13...eveloppez-com/, j'ai rien compris et j'ai poste ici ma question.

    actuellement je poursuis ce tutorial :
    http://beuss.developpez.com/tutoriels/pcasm/
    l'explication est bien mais il n'y a pas des exercices pour poursuis le cours, la théorie seul case seulement la tête.

    qu'est ce que tu me conseil ?

    j'aimerai un tutorial un peux basé sur la language C.
    juste pour mieux comprendre, parce que je pige mieux en C que en théorie de l'assembleur.

    sinon est ce que tu as un tutorial français qui explique quelque chose et qui donne un exercice ?

    j'ai besoin de ton aide, assembleur est la language que j'ai aimé depuis mon enfance, est ce que tu peux m'aide ?.

    vraiment j'ai chercher dans tout les écoles prives et il y'en a pas.

    je veux pas etre un ingénieur pour que je sois fort, je vais etre fort sans le titre ingénieur l'informatique c'est simple il faut juste quelqu'un qui explique bien c'est tout.

    j'aimerai realise 1 hello world, comment je vais faire ?

    je compte sur toi frere et merci avance.

  4. #4
    Membre très actif
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Par défaut
    je me base toujours sur le tuto, voilà ma source :

    Code : 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
    #include <stdio.h>
     
     
    void asm_main()
    {
    	__asm{
     
    			%include "asm_io.inc"
    			prompt1 db "hello world hello merde mais enfin tu ne veux pas marché ? ", 0
    			_asm_main:
    				mov eax, prompt1  
    				call print_string
    	}
     
    }
     
     
    int main()
    {
     
    int ret_status;
     
    ret_status = asm_main();
     
    return ret_status;
     
    }
    voici l'image de mon projet :



    http://img14.imageshack.us/i/96054825.png/

    l'include %include "asm_io.inc" marche pas

    ou est le problème ?

    dans le tutorial il y'a beaucoup d'explication j'ai bien aimé ok mais zéro exercice, je ne sais même pas comment faire un projet ooh mon dieu

  5. #5
    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
    Par défaut
    Bonjour,

    on ne peut pas inclure de fichier ni déclarer de chaine dans les blocs "__asm", ceux ci sont réservés uniquement au code assembleur (c-a-d uniquement les instructions).

    Si tu souhaites faire quelque chose de plus complexe (inclusion de fichier *.inc, déclaration de section, de chaine de caractères, etc.) il faut passer par la compilation séparée et se conformer uniquement à la syntaxe de l'assembleur qui travaille en sous main (ça peut être MASM, mais tout aussi bien NASM ou un autre assembleur, tout dépend de la configuration choisie).

    Dans le cas où tu travailles avec les blocs "__asm" il faut faire tout ce qui n'est pas du code en C (comme la déclaration de chaines). Ca n'est pas un problème inhérent au bloc __asm dans le sens ou celui-ci n'est fait que pour abriter des instructions et pas autre chose.

    Pour les cas complexes, VS2008 laisse le choix d'utiliser un assembleur externe de son choix (et pas seulement MASM).

    Si tu souhaites vraiment faire de l'assembleur je ne peux que te conseiller d'utiliser un programme d'assemblage dédié (i.e. NASM, MASM, RosASM, TASM, etc.) et non de mélanger C et asm (quitte ensuite à lier tes fichiers objets assembleur avec des fichiers objets provenant d'un compilo C).

    Un exemple pour l'utilisation de chaines avec printf:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #include <stdio.h>
    #include <stdlib.h>
     
    //la chaine peut être globale (comme ici), ou locale à la fonction, mais *pas* dans le bloc __asm
    char in_func[] = "Dans la fonction my_printf\n";
     
    int my_printf(char * string)
    {
    	int result;
    	__asm{
    		; affiche in_func
    		push offset in_func
    		call dword ptr [printf]
     
    		; affiche argument "string"
    		push string
    		call dword ptr [printf]
    		mov result, eax
    	}
     
    	return result;
    }
     
    int main(void)
    {
    	int res;
    	char test[] = "une phrase de test\n";
     
    	res = my_printf(test);
    	printf("%i caractere affiches\n", res);
     
    	return 0;
    }

  6. #6
    Membre très actif
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Par défaut
    T'es trop fort.
    Dis-moi s'il vous plait, peux-tu faire un petit tutorial qui donne juste quelque notions de base ?
    Pourquoi en fait :
    et pas Pas besoin d'expliquer les bits et les autres trucs mais juste, l'explication de la fonction et un exemple appliqué pour voir son rôle.

    Pas besoin qu'il soit un tutorial parfait, je veux juste qu'il me donne les notions de base.

    L'équivalent de:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int ma_variabe = 5;
     
    double ma_variable = 5;
     
    int mafonction()
    {
    }
     
    ...
    en Assembleur.

    J'ai bien compris la première partie du tutorial mais je me suis coincé dans la pratique.

    Les tutos d'Assembleur manquent.

    Et je vois que t'es vraiment fort pour nous faire juste le départ et on va se débrouiller pour le reste.

    Où télécharger MASM, comment compiler une source, c'est quoi la fonction main() en Assembleur...

    Je veux juste les trucs de base.

    Et merci avance.

Discussions similaires

  1. [Débutant] [Visual studio 2008] Incrémenter ou modifier données dans fichier Excel
    Par Mykimix dans le forum Visual Studio
    Réponses: 0
    Dernier message: 19/09/2012, 22h22
  2. Réponses: 1
    Dernier message: 18/02/2009, 09h56
  3. Peut on importer un projet VBA excel dans Visual Studio 2008 ?
    Par tapas_dev dans le forum Visual Studio
    Réponses: 1
    Dernier message: 18/11/2008, 15h40
  4. Ajouter une refrence dans Visual studio 2008
    Par aallal dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 29/09/2008, 12h51
  5. Réponses: 1
    Dernier message: 24/01/2008, 14h21

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