É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