none
Utilisation de l'assembler en ligne RRS feed

  • Discussion générale

  • Bonjour, 

    J'essaye d'utiliser l'assembleur en ligne en c++, sans trop de succès. L'objectif est d'observer les valeurs de sorties de certaines instructions (and, add, sub, ...), pour différentes types d'entrées (signées, non signées, 8, 16 ou 32 bits). 

    Pour cela je crée des routines simples: 

    bool o test_and(uint32_t i1, uint32_t i2)
    {
    uint32_t eflag;
    {
    __asm movzx eax, i1;
    __asm and eax, i2;
    __asm pushfd;
    __asm pop eflag;
    }
    return (eflag & 1U<<6 ? 1 : 0); /* pour observer le Carry Flag */
    }

    Le problème, c'est que l'opération movzx de charge pas les 32 bits d'i1, mais les huit premiers... Ce n'est pas ce à quoi je m'attendais, étant donné que i1 est bien définis comme un entier sur 32 bit. 

    Comment dois-je faire, sachant qu'en plus, j'ai une petite mécanique de définition des types de i1 et i2 avec des templates pour pouvoir choisir facilement un type de 8, 16 ou 32 bits ?

    J'utilise Visual c++ express 2013 en mode 32 bits sur un OS/host 64 bits. 

    Cordialement,

    A.G.

    • Type modifié Aurel Bera jeudi 10 juillet 2014 06:25 disc
    lundi 7 juillet 2014 18:34

Toutes les réponses