utilisation d'une fonction localisee en case memoire 0xE00Fu?
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

utilisation d'une fonction localisee en case memoire 0xE00Fu?



  1. #1
    zaskzask

    Question utilisation d'une fonction localisee en case memoire 0xE00Fu?


    ------

    Bonjour

    Je ne connais pas bien le language C mais je voulais savoir :

    En language C, si j'ai deux variables var1 et var2, que signifie :

    Code:
    ((UINT8(*)(UINT16*,UINT8))((UINT16) 0xE00Fu))(var1,var2)
    ?

    Merci pour votre aide

    -----

  2. #2
    Chanur

    Re : utilisation d'une fonction localisee en case memoire 0xE00Fu?

    Oui, c'est le lancement d'une fonction localisée en 0xE00Fu, après lui avoir défini comme prototype :
    UINT8 fonction (UINT16*,UINT8)
    Il est entendu que var1 doit être un pointeur vers un unsigned short (ou quelque chose d'équivalent) et que var2 doit être un unsigned char

    Mais c'est horrible ! En particulier parce que ce n'est pas du tout portable.

    Normalement on brûle les gens qui font ça sur la place publique et on les maudit jusqu'à la 53ème génération.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  3. #3
    zaskzask

    Re : utilisation d'une fonction localisee en case memoire 0xE00Fu?

    Code:
    ((UINT8(*)(UINT16*,UINT8))((UINT16) 0xE00Fu))(var1,var2)
    Je n'arrive pas a décortiquer la syntaxe. Quelle partie de l'instruction signifie quoi?

  4. #4
    Chanur

    Re : utilisation d'une fonction localisee en case memoire 0xE00Fu?

    ( ( UINT8(*)(UINT16*,UINT8) ) ((UINT16) 0xE00Fu) ) (var1,var2)

    0xE00Fu est une constante numérique en hexa qu'on caste en entier non signé sur 2 octets
    qu'on caste vers le type UINT8(*)(UINT16*,UINT8)
    (du coup, le cast (UINT16) ne sert à rien)

    Le type UINT8 (*) ( UINT16*,UINT8 ) désigne : un pointeur vers une fonction ayant comme paramètres un pointeur vers un entier non signé sur 2 octets et un entier non signé sur un octet, et qui retourne un entier sur 1 octet

    On a donc transformé 0xE00Fu en un pointeur vers une fonction, et on lance cette fonction avec les arguments var1 et var2 (et on a au minimum un warning si var1 et var2 ne sont pas respectivement un pointeur UINT16* et un entier UINT8)

    C'est pourtant facile.
    Dernière modification par Chanur ; 02/05/2017 à 21h36.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : utilisation d'une fonction localisee en case memoire 0xE00Fu?

    Citation Envoyé par Chanur Voir le message
    Normalement on brûle les gens qui font ça sur la place publique et on les maudit jusqu'à la 53ème génération.
    En effet mais c'est le genre de truc qui te faisait gagner à l'Obfuscated C Contest au début

    https://fr.wikipedia.org/wiki/Intern...C_Code_Contest

Discussions similaires

  1. Firefox 3.6 et utilisation mémoire
    Par invité576543 dans le forum Logiciel - Software - Open Source
    Réponses: 23
    Dernier message: 14/05/2010, 09h01
  2. Utilisation de mémoire SPI sur une ligne SPI utilisé
    Par VIIV dans le forum Électronique
    Réponses: 1
    Dernier message: 30/12/2009, 13h11
  3. Adresse Case mémoire PIC16F628
    Par invite70684c77 dans le forum Électronique
    Réponses: 3
    Dernier message: 07/08/2009, 12h11
  4. Fonction d'onde d'une particule localisée
    Par Seirios dans le forum Physique
    Réponses: 12
    Dernier message: 01/09/2007, 20h35
  5. iexplore.exe utilisation de la mémoire...
    Par invite1959eb9d dans le forum Logiciel - Software - Open Source
    Réponses: 10
    Dernier message: 24/04/2004, 21h39