具有内联程序集的写入功能

Microsoft 专用

如果编写具有内联程序集代码,它的一个功能很容易将参数传递给函数和返回从它的值。下面的示例比较为个内联汇编首先编写为一个单独的汇编然后重写的函数。函数中,调用 power2,接收两个参数,使用第一个参数是 2 到第二个参数的功能。编写为一个单独的汇编,此功能可能如下所示:

; POWER.ASM
; Compute the power of an integer
;
       PUBLIC _power2
_TEXT SEGMENT WORD PUBLIC 'CODE'
_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+4] ; Get first argument
        mov ecx, [ebp+6] ; Get second argument
        shl eax, cl     ; EAX = EAX * ( 2 ^ CL )
        pop ebp         ; Restore EBP
        ret             ; Return with sum in EAX

_power2 ENDP
_TEXT   ENDS
        END

因为它为一个单独的汇编编写,函数要求单独的源文件和程序集和链接步骤。C 和 C++ 函数参数在堆栈,因此此版本通常通过 power2 函数访问其由其位置实参堆栈。( 设计 指令,可用于 MASM 和一些其他汇编,按名称还访问堆栈参数和局部堆栈变量。) 的说明

示例

此程序写入具有内联程序集代码的 power2 功能:

// 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
}

power2 函数的内联版本按名称引用其参数并显示在源文件和程序的其余部分相同。此版本还需要的程序集指令。

由于 power2 的内联版本不执行 c. return 语句,它将生成一个无害的警告,如果您在生成警告等级 2 或更高版本。函数返回值,但是,编译器无法在不 return 语句时调用。可以使用 #pragma 警告 禁用此警告的生成。

特定于 Microsoft 的结尾

请参见

参考

使用C或C++在__asm块