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 :

traduction d'assembleur vers du C - probleme 32 vers 64 bits


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut traduction d'assembleur vers du C - probleme 32 vers 64 bits
    Bonjours, voila j'ai recemment porté un programmé en C sous WIN32 vers la plateforme 64 (x64), le seul hic est que sous x64 le mot __asm n'est plus acceptée et j'aimerai que l'on m'aide à traduire la fonction suivante de asm vers c, voici mon code C avec le mot asm

    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
    SWORD jpeg_get_svalue(BYTE k,DWORD wordval,DWORD start_neg_pow2)
    // k>0 always
    // Takes k bits out of the BIT stream (wordval), and makes them a signed value
    {
    	_asm {
    		   xor ecx, ecx
    		   mov cl,k
    		   mov eax,[wordval]
    		   shl eax,cl
    		   shr eax, 16
    		   dec cl
    		   bt eax,ecx
    		   jc end_macro
    			 inc cl
    		   mov ebx,[start_neg_pow2]
    		   add ax,word ptr [ebx+ecx*2]
    		 end_macro:
    	}
    }

    merci de m'avoir lu.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Points : 128
    Points
    128
    Par défaut
    Ca dépend du compilateur que tu utilises. Peut-être que c'est pas la bonne syntaxe.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    merci de me repondre mais j'utilise le visual studio 2010 professionnel de microsoft.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Que souhaites-tu faire exactement : pouvoir appeler __asm (ou equivalent), ou bien comprendre ce que fait le code assembleur que tu donnes, pour pouvoir le traduire en langage C ?

    Question subsidiaire : si ce bout de code est en assembleur dans un programme C, il y a surement une raison. La connais-tu, et peux-tu t'en affranchir (par exemple si c'est pour des raisons de performance, est-ce que tu peux avoir des performances moindres ? Si c'est parce que tu travailles sur un sous-ensemble du C (sur un micro-controleur par exemple) et que ce code remplace une fonction C non disponible, est-elle disponible sur ta nouvelle cible ? ...)

    Et enfin, est-ce que l'assembleur de tes deux architectures est identique ? Si ce n'est pas le cas, il est peu probable que tu puisses avoir un code unique pour les deux cibles.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    merci de m'avoir repondu, moi ce que je souhaite c'est comprendre ce que fait ce code assembleur et le remplacer par du language c.
    Pour la question subsidiaire, en fait il s'agit d'un bout de programme qui decompresse des images.jpeg, et qu'il y avait des inclusions d'assembleur pour des raisons de perfomances.Quant à moi j'accepterai des perfomances moindres, mais entre le C et l'assembleur il n'y a pas beaucoup d'ecart de rapidité.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Points : 128
    Points
    128
    Par défaut
    En partant du principe que la valeur retournée par la fonction est dans EAX (?), je propose ça :
    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
    28
    29
    30
    31
    32
    33
        DWORD swordval = 0;
     
    /*
        xor ecx, ecx
        mov cl,k
        mov eax,[wordval]
        shl eax,cl
        shr eax, 16
    */
        swordval = (wordval << k) >> 16;
     
     
    /*
        dec cl
        bt eax,ecx
        jc end_macro
    */
        if (swordval & (k - 1))
        {
            return swordval;
        }
     
     
        else
        {
    /*
        inc cl
        mov ebx,[start_neg_pow2]
        add ax,word ptr [ebx+ecx*2]     
    */
            swordval = (WORD)swordval + (WORD)*(start_neg_pow2 + 2 * k); /* Je ne suis pas sûr du tout */
            return swordval;
        }

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par nicolasprogrammeur Voir le message
    Quant à moi j'accepterai des perfomances moindres, mais entre le C et l'assembleur il n'y a pas beaucoup d'ecart de rapidité.
    Intrinsequement, il n'y a pas d'ecart. Par contre, le compilateur est generique, c'est a dire qu'il fonctionne dans tous les cas. Dans ton cas, tu peux avoir des specificites qui te permettent de gagner du temps car tu es certain que tu ne pourras te trouver dans certains cas.

    Bref, maintenant que la question est elucidee, je transfers ton post dans forum assembleur pour que des gens comprenant bien ce langage puissent t'aider.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    bonjours et merci sam1507, mais malheuresement ca ne marche pas mais j'aurais au moins appris une chose c'est qu'il fait une lecture de la memoire à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add ax,word ptr [ebx+ecx*2]
    .

  9. #9
    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
    Hello,

    je suis d'accord avec la transcription de sam1507.

    Il y a néanmoins un problème du coté de la définition de la fonction qui devrait être quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SHORT jpeg_get_svalue(BYTE k, DWORD wordval, WORD* start_neg_pow2);
    D'après le code assembleur, start_neg_pow2 est bien un pointeur vers un tableau de WORD.

    J'aurais transcrit comme suit (pas testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SHORT jpeg_get_svalue(BYTE k, DWORD wordval, WORD* start_neg_pow2)
    {
        DWORD res = (wordval << k) >> 16;
        // bt eax, ecx : test le bit à la position ecx dans eax, met le résultat dans cf
        tmp = (res >> (k- 1)) & 1; // shift le bit à tester à droite et ne garde que lui
        if ( ! tmp )
        {
            res = start_neg_pow2[k] + res; 
        }
     
        return (SHORT)res;
    }

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjours et merci à toi Neitsa, ton code fonctionne parfaitement, j'ai maintenant une application windows 64 bits ecrite en C qui decompresse des images.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.2] Probleme export vers excel avec la classe phpexcel2007
    Par philippegard dans le forum Langage
    Réponses: 1
    Dernier message: 21/09/2009, 14h10
  2. probleme eVC vers VC2005
    Par skalimer0 dans le forum MFC
    Réponses: 4
    Dernier message: 28/11/2007, 16h19
  3. [JVCL] probleme passage ver 3.1 -> 3.2
    Par TicTacToe dans le forum Delphi
    Réponses: 3
    Dernier message: 07/12/2006, 13h29
  4. [FLASH MX2004] Probleme geturl vers frame html
    Par condorbleu777 dans le forum Flash
    Réponses: 2
    Dernier message: 18/09/2006, 01h57
  5. Traduction d'Assembleur en langage C
    Par Aquadrox dans le forum Assembleur
    Réponses: 6
    Dernier message: 01/06/2005, 10h40

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