Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Específico da Microsoft
Observação
A montagem em linha só está disponível para destinos x86. Para funcionalidade semelhante no código x64 ou ARM64, use intrínsecos do compilador.
Se você escrever uma função com código de assembly embutido, é fácil passar argumentos para a função e retornar um valor dela. Os exemplos a seguir comparam uma função escrita primeiro para um montador separado e depois reescrita para o montador em linha. A função, chamada power2, recebe dois parâmetros, multiplicando o primeiro parâmetro por 2 para a potência do segundo parâmetro. Como um arquivo assembler separado, a função pode ter esta aparência:
; 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
Uma vez que é escrito como um arquivo assembler separado, a função requer etapas separadas de montagem e link. Os argumentos das funções C e C++ costumam ser passados na pilha, portanto, esta versão da função power2 acede aos seus argumentos pelas suas posições na pilha. (A diretiva MODEL, disponível no MASM e noutros montadores de assemblagem, também permite o acesso a argumentos de pilha e variáveis locais da pilha por nome.)
Exemplo
Este programa grava a power2 função com código de montagem em linha:
// 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
}
A versão inline da função power2 refere-se aos seus argumentos pelo nome e aparece no mesmo ficheiro de origem que o resto do programa. Esta versão também requer menos instruções de montagem.
Como a versão embutida do power2 não executa uma instrução C return , ela causa um aviso inofensivo se você compilar no nível de aviso 2 ou superior. A função retorna um valor, mas o compilador não pode dizer que o faz na ausência de uma return instrução. Você pode usar #pragma warning para desativar a geração deste aviso.
END Específico da Microsoft