Partager via


Écriture de fonctions avec un assembly inline

Section spécifique à Microsoft

Remarque

L’assembly inline est disponible uniquement pour les cibles x86. Pour des fonctionnalités similaires dans le code x64 ou ARM64, utilisez les intrinsèques du compilateur.

Si vous écrivez une fonction avec du code assembleur inline, il est facile de transmettre des arguments à cette fonction et de retourner une valeur de celle-ci. Les exemples suivants comparent une fonction d'abord écrite pour un assembleur distinct puis réécrite pour l'assembleur inline. La fonction, appelée power2, reçoit deux paramètres, multipliant le premier paramètre par 2 à la puissance du second paramètre. En tant que fichier assembleur distinct, la fonction peut ressembler à ceci :

; power2.asm 
; x86 code for C interop
; Command line: ml /c /Cx /W3 /WX power2.asm 
        .686P
        .XMM
        .MODEL  flat

PUBLIC  _power2
; int power2(int num, int power);
; computes num x 2^power
_TEXT   SEGMENT
_power2 PROC
        push    ebp             ; save EBP
        mov     ebp, esp        ; Move ESP into EBP so we can refer
                                ;   to arguments on the stack
        mov     eax, [ebp+8]    ; load first argument
        mov     ecx, [ebp+12]   ; load second argument
        shl     eax, cl         ; compute result in EAX
        pop     ebp             ; restore EBP
        ret
_power2 ENDP
_TEXT   ENDS
END

Étant donné qu’elle est écrite en tant que fichier assembleur distinct, la fonction nécessite des étapes d’assembly et de liaison distinctes. Les arguments de fonction C et C++ sont généralement transmis sur la pile, par conséquent cette version de la fonction power2 accède à ses arguments par leur position sur la pile. (La MODEL directive, disponible dans MASM et d’autres assembleurs, vous permet également d’accéder aux arguments de pile et aux variables de pile locales par nom.)

Exemple

Ce programme écrit la fonction power2 avec le code assembleur inline :

// Power2_inline_asm.c
// compile with: /EHsc
// processor: x86

#include <stdio.h>

int power2( int num, int power );

int main( void )
{
    printf_s( "3 times 2 to the power of 5 is %d\n", \
              power2( 3, 5) );
}
int power2( int num, int power )
{
   __asm
   {
      mov eax, num    ; Get first argument
      mov ecx, power  ; Get second argument
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )
   }
   // Return with result in EAX
}

La version inline de la fonction power2 fait référence à ses arguments par nom et apparaît dans le même fichier source que le reste du programme. Cette version requiert également moins d'instructions assembleur.

Étant donné que la version inline de power2 n'exécute pas d'instruction return C, un avertissement sans incidence est généré si vous effectuez la compilation au niveau d'avertissement 2 ou ultérieur. La fonction retourne une valeur, mais le compilateur ne peut pas le dire en l’absence d’une return instruction. Vous pouvez utiliser #pragma warning pour désactiver la génération de cet avertissement.

FIN de la section spécifique à Microsoft

Voir aussi

Utilisation de C ou C++ dans __asm des blocs