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 :

Conversion ASM32 en C


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut Conversion ASM32 en C
    Bonjour,
    J'aurais besoin de convertir un code assembleur 32bits en C, en l'occurence celui ci :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include "Matrix.hpp"
    #ifdef __ARM_NEON__
     
    #define LOAD_MATRIX(q0, q1, q2, q3, r) \
    	"vld1.32     {"#q0", "#q1"}, ["#r"]!  \n" \
    	"vld1.32     {"#q2", "#q3"}, ["#r"]!  \n"
     
    #define SAVE_MATRIX(q0, q1, q2, q3, r) \
    	"vst1.32     {"#q0", "#q1"}, ["#r"]!  \n" \
    	"vst1.32     {"#q2", "#q3"}, ["#r"]!  \n"
     
    template<>
    Matrix4<float> Matrix4<float>::operator*(const Matrix4<float> &m) const{
    	Matrix4<float> result;
    	const float *idata1 = this->data();
    	const float *idata2 = m.data();
    	float *odata        = result.data();
     
    	__asm__ volatile(
    				 LOAD_MATRIX(q0, q1, q2, q3, %0)
    				 LOAD_MATRIX(q4, q5, q6, q7, %1)
     
    				 "vmul.f32  q8,  q4, d0[0] \n"
    				 "vmul.f32  q9,  q4, d2[0] \n"
    				 "vmul.f32  q10, q4, d4[0] \n"
    				 "vmul.f32  q11, q4, d6[0] \n"
     
    				 "vmla.f32  q8,  q5, d0[1] \n"
    				 "vmla.f32  q9,  q5, d2[1] \n"
    				 "vmla.f32  q10, q5, d4[1] \n"
    				 "vmla.f32  q11, q5, d6[1] \n"
     
    				 "vmla.f32  q8,  q6, d1[0] \n"
    				 "vmla.f32  q9,  q6, d3[0] \n"
    				 "vmla.f32  q10, q6, d5[0] \n"
    				 "vmla.f32  q11, q6, d7[0] \n"
     
    				 "vmla.f32  q8,  q7, d1[1] \n"
    				 "vmla.f32  q9,  q7, d3[1] \n"
    				 "vmla.f32  q10, q7, d5[1] \n"			 
    				 "vmla.f32  q11, q7, d7[1] \n"
     
    				 SAVE_MATRIX(q8, q9, q10, q11, %2)
    				 :
    				 : "r"(idata1), "r"(idata2), "r"(odata)
    				 );
     
    	return result;
    }
     
     
    #endif
    Quelqu'un aurais t'il une piste pour que je puisse faire ca "simplement" ?
    Merci d'avance

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    on ne convertit pas de l'assembleur vers un langage de plus haut niveau, c'est une opération de décompilation, les rares outils qui existent sont payants et pas très efficaces, la meilleure méthode c'est de connaitre l'assembleur et comprendre ce que fait le programme pour le ré-implémenter à l'identique autant que possible

    sinon basiquement à voir le prototype et l'enchainement des instructions ça ressemble une surcharge de l'opérateur *, donc pour permettre la multiplication de matrices Matrix4, probablement dans le cadre d'une app 3D genre OpenGL ou DirectX j'imagine, mais j'ai du mal à voir l'intérêt là comme ça...

  3. #3
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    Dans le doute, toujours lire la doc, surtout dans n'importe quel langage.

    http://infocenter.arm.com/help/index.../BABDCGGF.html

    vld
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Loads of a single vector or lane
     
    Perform loads and stores of a single vector of some type.
     
    Load a single vector from memory
     
    int32x2_t   vld1_s32(__transfersize(2) int32_t const * ptr); // VLD1.32 {d0}, [r0]
    vst
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Store a single vector or lane
     
    Stores all lanes or a single lane of a vector.
     
    Store a single vector into memory
     
    void  vst1_u32(__transfersize(2) uint32_t * ptr, uint32x2_t val); // VST1.32 {d0}, [r0]
    vmul, vmla
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Multiplication
     
    These intrinsics provide operations including multiplication.
     
    Vector multiply: vmul{q}_<type>. Vr[i] := Va[i] * Vb[i]
    float32x2_t vmul_f32(float32x2_t a, float32x2_t b);  // VMUL.F32 d0,d0,d0
     
    Vector multiply accumulate: vmla{q}_<type>. Vr[i] := Va[i] + Vb[i] * Vc[i]
     
    float32x2_t vmla_f32(float32x2_t a, float32x2_t b, float32x2_t c);  // VMLA.F32 d0,d0,d0
    pour la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    				 SAVE_MATRIX(q8, q9, q10, q11, %2)
    				 :
    				 : "r"(idata1), "r"(idata2), "r"(odata)
    				 );
    il semble que ça surcharge le numero de registre rX avec X egal à (idata1), (idata2) et (odata).
    ou un truc dans le genre.


    donc, on a un load, un store , un mul et un mul+accumul

    ARM fourni un modèle mathématique pour chaque instruction, il ne reste plus qu'à copier coller et adapter pour le c++

    Je deconseille fortement l'utilisation de C++ pour ces opérations, ça risque d'être hyper lent à l'arrivée.
    Par contre, un petit #ifdef INTEL_ARCH pour déclarer les fonctions en assembleur x86, ça ne sera pas du luxe, le jeu SSE possède le même genre d'instructions vectorielles.

  4. #4
    Invité
    Invité(e)
    Par défaut
    le jeu SSE possède le même genre d'instructions vectorielles.
    Ou encore avx2 (https://software.intel.com/en-us/isa...ions/intel-avx)

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par edfed Voir le message
    donc, on a un load, un store , un mul et un mul+accumul
    mon tout est une multiplication de matrices comme fournie en standard par des bibliothèques comme opengl ou directx, la question se déportant du coup sur l'origine de ce code assembleur et le bienfondé de vouloir réinventer une roue probablement déjà bien optimisée

  6. #6
    Invité
    Invité(e)
    Par défaut
    BufferBob : C'est pour raison de faire du pognon vite fait que tu dis ça ? ^^

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par shaynox Voir le message
    BufferBob : C'est pour raison de faire du pognon vite fait que tu dis ça ? ^^
    j'ai pas compris ce que tu veux dire

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ton opinion sur la réinvention de la roue.

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par shaynox Voir le message
    Ton opinion sur la réinvention de la roue.
    ben le fait que la multiplication de matrices est déjà implémentée par des dev très compétents et que chercher à ré-implémenter soi-même en s'imaginant qu'on va faire mieux est assez souvent faux, à peu près autant que de croire qu'écrire du code assembleur accélère les choses, c'est une idée reçue mais ce qui compte c'est pas tant le langage que l'implémentation faite par le développeur, ajoute à ça que C++ est un langage très proche de la machine et que le code machine dépend aussi du compilateur utilisé

    par contre j'ai pas compris l'idée de faire du pognon, anyway... (les libs et sdk opengl et directx sont gratuits si c'est ça que tu voulais dire)

    edit: un exemple d'implém en C++ directement >ici<, faudrait voir le code généré derrière...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Cool, alors maintenant la question est, où est le mal, vu qu'il n'embête personne ?

    Après tout, il fait ce qu'il veut ^^

  11. #11
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par shaynox Voir le message
    Cool, alors maintenant la question est, où est le mal, vu qu'il n'embête personne ?
    Après tout, il fait ce qu'il veut ^^
    ben... oui, j'ai dit le contraire ? je comprends pas pourquoi tu te mets en opposition là

  12. #12
    Invité
    Invité(e)
    Par défaut
    Juste que je ne peux m'empêcher de ne voir que du mal et de défendre cette position, quand une personne reprend ce troll intuable sur la non-utilité de réinventer de la roue.

    la question se déportant du coup sur l'origine de ce code assembleur et le bienfondé de vouloir réinventer une roue probablement déjà bien optimisée
    C'est de cela que j'ai voulu parler ^^
    Dernière modification par Invité ; 16/06/2015 à 22h29.

  13. #13
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par shaynox Voir le message
    je ne peux m'empêcher de ne voir que du mal
    j'imagine facilement que ça doit pas être simple à vivre...

    ce troll intuable sur la non-utilité de réinventer de la roue.
    c'est pas un troll c'est juste une opinion différente de la tienne shaynox

    edit:
    Citation Envoyé par shaynox Voir le message
    C'est de cela que j'ai voulu parler ^^
    je pense que pour le moins tu dois confondre les notions de "pas nécéssaire", "pas pertinent" et "pas autorisé"

  14. #14
    Invité
    Invité(e)
    Par défaut
    j'imagine facilement que ça doit pas être simple à vivre...
    Tu l'a dis

    c'est pas un troll c'est juste une opinion différente de la tienne shaynox
    Je le vois comme un troll, car beaucoup de monde veulent réinventer la roue, y compris dans l'univers des concurrents.

    L'exemple des cpu d'amd qui n'ont pas encore l'avx2, enfin il vont le faire cette année avec son Excavator et à leur façon donc, alors que intel le supporte déjà depuis 2013 avec Haswell.
    (ils pourraient très bien jeter l'éponge et dissoudre la division cpu d'amd, puis de se fusionner avec l'équipe intel aussi ^^).

    Moi je me vois en concurrence avec nvdia et amd pour leurs gpu du coup, avec mon moteur n'utilisant que la gdi de Windows et aucune fonction du pipeline du gpu pour le traitement de vertex et textures et 3D et j'en oublie surement, sauf pour le transfert d'image à l'écran directement, par exemple.

    Un concurrent qui n'est certes pas connu des medias, ni du publique, ni part de marché, mais je me sens quand même comme un concurrent, pitit concurrent certes, qui tente sa chance et aime essayer de modéliser le monde comme il l'entend x)


    Et aussi ma propre ABI x64 pour intel proc pour mon propre OS. ect ^^


    Et par la même occasion, sachant que je ne développe qu'en asm, je suis en concurrence directe avec tous les autres langages célèbres. (ce qui doit être le cas pour l'auteur, enfin pour son programme en tout cas)

    Enfin troll ou pas troll, ça reste une différence d'opinions en somme.
    Dernière modification par Invité ; 17/06/2015 à 00h05.

  15. #15
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    bof, opengl et directX l’implémentent, ouais, c'est sur, mais la machine qui fait tourner ce code est elle équipée de opengl et/ou directX?

    possède elle seulement un gpu ou même une carte graphique.

    Ce code est il seulement à destination d’opérations à visée graphique ou 3D?

    seul steve jobs le sait, et comme on peut pas lui demander, on va se contenter de se dire:

    "il était une fois un codeur qui a codé une fonction en assembleur inline pour tester et éprouver un jeu d'instructions ARM relativement récent afin d'effectuer une tache mathématique particulière."

    voilà.

    pour ce qui est de réinventer la roue, mon opinion est que si personne ne réinventait la roue, cette page sur ce site http://www.styletuning.com/index.php?espace_cat_id=630 n'existerait pas.

  16. #16
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut TROOLLL
    Et comme je vois un nouveau troll, j'en profite pour troller. ça m'avait manqué depuis le temps...


    Coder avec Nasm c'est comme manger avec les pieds.

    et raconter sa vie à chaque post, c'est NULL, surtout quand la base du post, c'est de faire un truc technique sans se préoccuper de l'age du capitaine ou du diamètre de la nouvelle roue à réinventer.

    donc, j’espère que ma réponse de base ne sera pas perdue au milieu des déblatérations moisies qui n'ont aucun autre but que d'exprimer la frustration et l'ennui enduré par leurs auteurs

    bonne journée.

  17. #17
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par edfed Voir le message
    j’espère que ma réponse de base ne sera pas perdue au milieu des déblatérations moisies qui n'ont aucun autre but que d'exprimer la frustration et l'ennui enduré par leurs auteurs
    je trouve pas que ta première réponse soit tellement pertinente, tu te contente de décrire les quatre instructions rencontrées sans pour autant répondre à la question initiale

    du coup si on considère ton dernier post teinté d'arrogance et de condescendance le tout donne une intervention globale un peu en dessous du reste de la discussion, n'en déplaise à la haute opinion que tu sembles t'en faire

  18. #18
    Invité
    Invité(e)
    Par défaut
    edfed:

    Je t'invite à essayer de t'amuser à le dire à toute la communauté assembleur que ce soit nasm, tasm, fasm, masm, sasm sur leur forum et sur osdev aussi (et j'en oublie certainement)

    Sache qu'en France, on est les seuls à ne pas s'intéresser au développement assembleur, regarde juste les offres d'emploi d'Intel en France, que du marketing/business, aucun poste requièrent de l'assembleur:
    https://intel.taleo.net/careersectio.../jobsearch.ftl (See all locations, tape france, coche + add) et enjoy le peu que tu vas lire.

    Et pour l'etranger:
    https://intel.taleo.net/careersectio.../jobsearch.ftl (tape assembly dans keyword et enjoy) mes préférés: https://intel.taleo.net/careersectio...ftl?job=762213 https://intel.taleo.net/careersectio...ftl?job=762204

    De plus, de toute l'aide que j'ai apportée en assembleur durant cette année, ils étaient tous de nationalité étrangère (beglique, espagne, algérie, ...) concernant des devoirs à faire, le peu que j'ai en nationalité française, c'était par hobbies (comme moi, car je ne gagne pas ma vie avec ).

    Petit extra (OS written in assembly):
    - MenuetOS
    - BareMetal OS
    - kolibriOS
    - Glaux OS https://gitlab.com/glauxosdever/glaux-os
    - HackOS https://sourceforge.net/projects/shaynoxhackos/
    Dernière modification par Invité ; 17/06/2015 à 14h41.

  19. #19
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1

  20. #20
    Invité
    Invité(e)
    Par défaut
    Maintenant, il te manque plus que l'envoyé:
    - aux auteurs des différents assembleurs
    - via mail-list/newsgroup, irc (freenode #osdev #nasm #intel #asm #asm-fr (ouais bon, il n'y a personnes, en même c'est un chan pour fr)
    - le reste des forums des assembleurs
    - ...

    Gagne ton pari ^^
    Dernière modification par Invité ; 17/06/2015 à 16h06.

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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