begin process at 2012 05 29 13:05:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

Naked function, asm inline, et chaînes de caractères


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Naked function, asm inline, et chaînes de caractères

jeudi 10 novembre 2011 à 05:06:52 | Naked function, asm inline, et chaînes de caractères

stagiairecpp

Bonjour,

Voilà je rencontre un soucis très particulier sous VS pour une situation très particulière.
J'en appelle donc directement aux pro-codeurs adeptes de fonctions de cet acabit (BruNews si tu t'es pas reconnu dans le lot là ... ).

Contexte :
- Fonction naked
- Utilisation de variables globales impossible (aucune variable en section data)
- (Taille du binaire critique)

Problème :
Dans cette fonction j'utilise beaucoup de chaînes passées par pointeurs à des api win32.
Malheureusement pour moi, les fonctions naked interdisent la déclaration directe de chaines (de toutes façons ça terminerait en section data), et je ne peux pas employer de globales (car section data) comme précisé précédemment.
Autre grand malheur, l'assembleur inline de VS (les autres je sais pas) n'autorise pas l'utilisation de token du genre 'DB' (donc section code/text, ce que je souhaite).


Pour l'instant ce que je fais c'est que je déclare en C (ça pourrait aussi se faire directement en asm) un tableau de char en local (donc dans la pile) et je prend soin de sauvegarder ebp et décaler esp en tête de fonction (pour rétablir bien sûr à la fin).
Ensuite, premier cas de figure, j'initialise les octets un par un, ou second cas de figure je les initialise par double mot (donc en tenant compte du low-endian car destiné x86).
Le soucis c'est premièrement que c'est couteux en opcodes (la première solution encore plus que la seconde), et deuxièmement que ça devient très vite carrément illisible (la seconde solution encore plus que la première).

Le top question lisibilité et optimisation de la taille serait donc de trouver le moyen d'imposer au compilateur de faire un db directement dans le code, soit en asm inliné (mais la msdn dit que c'est pas possible), soit en équivalent C (mais je vois pas comment).
L'ultime solution à laquelle j'ai pensé serait de traduire ça directement en opcode puis de pointer dessus à l'aide d'une combinaison astucieuse de label/call/pop. Ca fonctionnerait mais là ça deviendrait vraiment pas bon pour ma santé mentale...

Existe t'il donc à votre connaissance une quelconque astuce ? Ou bien suis je condamné à splitter mon projet en deux sous-projets donc le second serait compilé directement via masm ?

Merci d'avance.

++
jeudi 10 novembre 2011 à 05:16:09 | Re : Naked function, asm inline, et chaînes de caractères

stagiairecpp

Ps (désolé, pas d'édition possible) :

Quand j'ai dis "pointer dessus à l'aide d'une combinaison astucieuse de label/call/pop", je voulais dire "pusher ça à l'aide d'une combinaison astucieuse de label/call/pop", ce qui serait idéale pour l'utilisation que j'en aurai, à savoir les passer en paramètre.

Mais bon je précise dans une but de cohérence mais ça n'est très probablement pas la solution pour laquelle j'opterai au final...

++
jeudi 10 novembre 2011 à 16:47:03 | Re : Naked function, asm inline, et chaînes de caractères

pop70

Salut,
bon moi j'y connais pas grand chose en assembleur, et donc ce que tu dis ne me parle pas trop...

Par contre, je comprends:

Utilisation de variables globales impossible (aucune variable en section data)



Et là peut-être y'aurait-il une quelconque astuce, car a moins que je ne me trompe, si les variables globales (et statiques) ne sont pas initialisées, elles ne partent pas dans le data, mais dans le BSS ;)

Voilà, sinon pour ma part je ne pourrai pas te fournir plus d'aide; mais bon je dis déjà ça au cas ou ça puisse t'aider


C++dialement,
Pop70
jeudi 10 novembre 2011 à 20:40:38 | Re : Naked function, asm inline, et chaînes de caractères

BruNews

Administrateur CodeS-SourceS
Salut,

il ne faut surtout jamais prendre tout ce qu'on voit pour argent comptant. Quand je montre une initialisation directe d'octets pour former une chaine, c'est pur but didactique, absolument pas une méthode de prog à utiliser partout. Surtout que comme tu le signales c'est souvent couteux en code.

Si taille du binaire est critique, as-tu viré la CRT ?
C'est la première chose à faire.

ciao...
BruNews, MVP VC++
vendredi 11 novembre 2011 à 17:23:06 | Re : Naked function, asm inline, et chaînes de caractères

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

_emit est dispo sous VC pour écrire les octets que l'on veut dans du code.

(Pour le code suivant, attention à désactiver l'édition des liens incrémentale pour que HelloWorldString ne pointe pas sur un jmp).
Code C/C++ :
#include <windows.h>

__declspec(naked) void HelloWorldString()
{
   __asm
   {
      __asm _emit 'H' __asm _emit 'e' __asm _emit 'l' __asm _emit 'l' __asm _emit 'o' __asm _emit ' '
      __asm _emit 'w' __asm _emit 'o' __asm _emit 'r' __asm _emit 'l' __asm _emit 'd' __asm _emit '!' __asm _emit 0
   }
}

__declspec(naked) void __stdcall NakedAsmFunction()
{
   __asm
   {
     push MB_OK
     push HelloWorldString
     push HelloWorldString
     push 0
     call dword ptr MessageBox
     ret
   }
}

int __cdecl WinMainCRTStartup()
{
  NakedAsmFunction();
  return 0;
}
samedi 12 novembre 2011 à 11:42:05 | Re : Naked function, asm inline, et chaînes de caractères

stagiairecpp

Bonjour à tous,

D'abord, merci à vous trois d'avoir pris le temps de vous pencher sur mon problème.
Ensuite, je suis en visite pour le weekend donc je n'ai pas moyen de faire un quelconque test pour l'instant.

J'ai essayé dans un premier temps de traduire mes chaines en opcodes tout simplement en les copiant à l'EP d'un exe quelconque que j'ouvrais ensuite avec un debugger préalablement configuré pour breaker sur l'EP.
Malheureusement, ça donne lieu à des opcodes de type 'jb short' dont l'asm inline de VS ne veut pas entendre parler en raison du mot clé 'short'. J'ai bien essayé de l'utiliser en majuscules entre un '#undef SHORT' et un 'typedef short SHORT', mais rien à faire.

Donc pour l'instant j'ai opté pour une solution très proche de la tienne rt15, sauf que j'utilise des nop que je viens remplir directement dans le binaire via un petit tool fait vite fait pour l'occasion. Comme c'est un sous-projet du premier que je lance en évennement post-compilation ça n'est pas trop galère mais ça reste un peu obscure pour qui n'a pas suivi l'avancement du projet.
En tous cas ça fonctionne très bien pour l'instant et ça m'a fait gagner presque 1Ko de code pour six pauvres petites chaines.
Pour debugger je pointe directement sur les chaines en dur du sous-projet vu que je suis obligé de changer le prototype des fonctions de toutes façon (essayez un peu de debugger du naked sous VS ...).

@pop70>
Oui effectivement ça part généralement en section bss (quoiqu'il me semble que VS agit différemment, mais comme précisé je n'ai rien pour vérifier dans l'immédiat).
De toutes façons je n'ai pas été précis dans mon explication : en fait ça n'est pas que je ne peux pas utiliser la section data, c'est que je ne peux pas utiliser d'autre section que la code/text.

@BruNews>
Il faut bien évidemment adapter la méthode au besoin, mais en l&#8217;occurrence l'initialisation directe d'octets s'impose.
Concernant la crt, le code en est déjà totalement exempt car c'est une condition sine qua non.

@rt15>
Lors de mes recherches je suis tombé sur ce mot clé dans un post concernant les compilateurs Borland. Très enthousiasmé j'ai directement tenté de l'employer sous VS mais rien à faire. En revanche je constate que tu le préfixes d'un underscore, ce que je n'avais pas fait de mémoire.
S'il s'avère que ça fonctionne avec ton orthographe alors ça serait la réponse à ma question.
Je teste ça dès que possible et vous tiens informés.

Merci, et bon weekend.

++
lundi 14 novembre 2011 à 00:27:46 | Re : Naked function, asm inline, et chaînes de caractères

stagiairecpp

Salut,

Super, ça fonctionne !

Merci.

++


Cette discussion est classée dans : directement, section, asm, inline, naked


Répondre à ce message

Sujets en rapport avec ce message

asm inline [ par tintin72 ] Bonjour,Je programme un petit jeu en OpenGL et j'aimerai savoir comment faire pour que les commandes clavier soit fluides et pas saccadées comme c'est DevCPP inline asm error [ par belette321 ] Bon, je suis en plein creation d'un petit dll qui utilisele ASM inline, j'ai plusieur fonction qui on touts les memeerreur. Cependant je ne trouve pas Inline asm + classe = erreur! [ par Darkneon ] Salut a tous.Lorsque je mets du codes assembleur dans ma classe le compilateur me renvoit l'erreur suivante."Inline assembly not allowed in inline and Envoiyer des donnees a la carte son [ par ElTonino ] Salut, je souhaiterai faire un prog qui enverai directement des donnees a la carte (sans fichier wav ou autre...) mais je ne sais pas dutout comment m Macro : renvoyer une chaîne avec une virgule [ par rt15 ] Salut,Je cherche désespérément à faire une macro qui renverrait une chaîne comprenant deux éléments séparés par une virgule.printf(TO_STRING(a, b));-> appel fonction en asm [ par LlufRuS ] Bonjour à tous,je souhaite appeler une fonction provenant d'une librairie dynamique en lui passant directement mes arguments sur la pile (malheureusem Problème de compilation de module pour le kernel linux [ par TorTukiTu ] Bonjour,Je cherche à compiler le module qui dit bonjour. J'ai téléchargé les sources du kernel (linux-headers-2.6.27-11) et j'ai copié les en-têtes da pointeur ram [ par mana ] bonjour j'aimerai pouvoir lire une adresse en ram voici mon probleme : int filtre(int &adresse){ int *p; p=&adresse+0; int imgl Critical section [ par dens2101 ] Bonsoir !!! J'ai une petite question concernant les Critical Section. Si je fais : CRITICAL_SECTION cs; InitializeCriticalSection(&cs); ( ... ) Inserer une detection directement dans mon client [ par foxx62 ] Salut à tous, Alors voilà j'ai compiler mon client sous Directx 9, sauf qu'il ne detecte pas si les utilisateurs le possède ou non. Alors comment ins


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales