MASM para x64 (ml64.exe)
O Visual Studio inclui versões hospedadas de 32 bits e 64 bits do MASM (o Microsoft Macro Assembler) para o código x64 de destino. Nomeado ml64.exe, é o assembler que aceita a linguagem do assembler x64. As ferramentas de linha de comando do MASM são instaladas quando você escolhe uma carga de trabalho C++ durante a instalação do Visual Studio. As ferramentas de MASM não estão disponíveis como um download separado. Para obter instruções sobre como baixar e instalar uma cópia do Visual Studio, confira Instalar o Visual Studio. Se você deseja somente as ferramentas da linha de comando, não o IDE completo, baixe as Ferramentas de Build para o Visual Studio.
Para usar ml64.exe na linha de comando, inicie um prompt de comando do desenvolvedor para destinos x64. Um prompt de comando do desenvolvedor define o caminho necessário e outras variáveis de ambiente. Para saber mais sobre como iniciar um prompt de comando do desenvolvedor, confira Criar código C/C++ na linha de comando.
Para saber mais sobre opções de linha de comando do ml64.exe, confira Referência de linha de comando de ML e ML64.
Não há suporte para o assembler embutido ou para o uso da palavra-chave ASM
para destinos x64 ou ARM64. Para portar o código x86 que usa o assembler embutido para x64 ou ARM64, você pode converter seu código em C++, usar intrínsecos do compilador ou criar arquivos de origem em linguagem assembler. O compilador do Microsoft C++ dá suporte a intrínsecos a fim de permitir que você use instruções de função especial, por exemplo, com privilégios, verificação de bits ou teste, interligado e assim por diante, o mais próximo possível de um modo multiplataforma. Para saber mais sobre os intrínsecos disponíveis, confira Intrínsecos do compilador.
Adicionar um arquivo de linguagem assembler a um projeto do Visual Studio C++
O sistema de projetos do Visual Studio dá suporte a arquivos em linguagem assembler criados usando MASM em seus projetos do C++. O MASM dá suporte total aos arquivos de origem da linguagem assembler x64 e os cria em arquivos de objeto. Em seguida, você pode vincular esses arquivos de objeto ao código C++ criado para destinos x64. É uma maneira de superar a falta de um assembler embutido x64.
Para adicionar um arquivo de linguagem assembler a um projeto existente do Visual Studio C++
Selecione o projeto no Gerenciador de Soluções. Na barra de menus, escolha Projeto, Personalizações de Build.
Na caixa de diálogo Arquivos de Personalização de Build do Visual C++, marque a caixa de seleção ao lado de masm(.targets,.props). Escolha OK para salvar sua seleção e fechar a caixa de diálogo.
Na barra de menus, escolha Projeto, Adicionar Novo Item.
Na caixa de diálogo Adicionar Novo item, no painel central, selecione Arquivo C++ (.cpp). No controle de edição Nome, insira um novo nome de arquivo que tenha uma extensão
.asm
em vez de.cpp
. Escolha Adicionar para adicionar o arquivo ao seu projeto e feche a caixa de diálogo.
Crie seu código de linguagem assembler no arquivo .asm
que você adicionou. Quando você compila sua solução, o assembler MASM é invocado para montar o arquivo .asm
em um arquivo de objeto que, em seguida, é vinculado ao seu projeto. Para facilitar o acesso a símbolos, declare suas funções de assembler como extern "C"
no código-fonte do C++, em vez de usar as convenções de decoração de nome C++ nos arquivos de origem da linguagem assembler.
Diretivas específicas a ml64
Você pode usar as seguintes diretivas específicas de ml64 no código-fonte da linguagem assembler que tem como destino x64:
A diretiva PROC
também foi atualizada para uso com ml64.exe.
Modo de endereço de 32 bits (substituição de tamanho do endereço)
O MASM emitirá a substituição de tamanho do endereço 0x67 se um operando de memória incluir registros de 32 bits. Por exemplo, os exemplos a seguir fazem com que a substituição de tamanho do endereço seja emitida:
mov rax, QWORD PTR [ecx]
mov eax, DWORD PTR [ecx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10d+0100h]
prefetch [eax]
movnti rax, QWORD PTR [r8d]
O MASM pressupõe o endereçamento de 64 bits se um deslocamento de 32 bits aparecer sozinho como um operando de memória. Atualmente, não há suporte para endereçamento de 32 bits com esses operandos.
Por fim, a combinação de tamanhos de registro em um operando de memória, conforme demonstrado no código a seguir, gera um erro.
mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]