x64용 MASM (ml64.exe)
Visual Studio에는 x64 코드를 대상으로 하는 32비트 및 64비트 호스트 버전의 MASM(Microsoft 매크로 어셈블러)이 모두 포함되어 있습니다. 명명된 ml64.exe x64 어셈블러 언어를 허용하는 어셈블러입니다. VISUAL Studio 설치 중에 C++ 워크로드를 선택하면 MASM 명령줄 도구가 설치됩니다. MASM 도구는 별도의 다운로드로 사용할 수 없습니다. Visual Studio의 복사본을 다운로드하고 설치하는 방법에 대한 지침은 Visual Studio 설치를 참조 하세요. 전체 IDE가 아닌 명령줄 도구만 원하는 경우 Visual Studio용 빌드 도구를 다운로드 합니다.
명령줄에서 ml64.exe 사용하려면 x64 대상에 대한 개발자 명령 프롬프트를 시작합니다. 개발자 명령 프롬프트는 필요한 경로 및 기타 환경 변수를 설정합니다. 개발자 명령 프롬프트를 시작하는 방법에 대한 자세한 내용은 명령줄에서 C/C++ 코드 빌드를 참조 하세요.
ml64.exe 명령줄 옵션에 대한 자세한 내용은 ML 및 ML64 명령줄 참조를 참조 하세요.
x64 또는 ARM64 대상에는 ASM
인라인 어셈블러 또는 키워드 사용이 지원되지 않습니다. 인라인 어셈블러를 사용하는 x86 코드를 x64 또는 ARM64로 포팅하려면 코드를 C++로 변환하거나, 컴파일러 내장 함수를 사용하거나, 어셈블러 언어 소스 파일을 만들 수 있습니다. Microsoft C++ 컴파일러는 내장 함수를 지원하여 권한 있는, 비트 검색 또는 테스트, 연동 등과 같은 특수 함수 지침을 플랫폼 간 방식에 최대한 가깝게 사용할 수 있도록 합니다. 사용 가능한 내장 함수에 대한 자세한 내용은 컴파일러 내장 함수를 참조 하세요.
Visual Studio C++ 프로젝트에 어셈블러 언어 파일 추가
Visual Studio 프로젝트 시스템은 C++ 프로젝트에서 MASM을 사용하여 빌드된 어셈블러 언어 파일을 지원합니다. MASM은 x64 어셈블러 언어 소스 파일을 완전히 지원하고 개체 파일로 빌드합니다. 그런 다음 이러한 개체 파일을 x64 대상용으로 빌드된 C++ 코드에 연결할 수 있습니다. x64 인라인 어셈블러의 부족을 극복하는 한 가지 방법입니다.
기존 Visual Studio C++ 프로젝트에 어셈블러 언어 파일을 추가하려면
솔루션 탐색기에서 프로젝트를 선택합니다. 메뉴 모음에서 프로젝트, 빌드 사용자 지정을 선택합니다.
Visual C++ 빌드 사용자 지정 파일 대화 상자에서 masm(.targets,.props) 옆의 확인란을 선택합니다. 확인을 선택하여 선택 항목을 저장하고 대화 상자를 닫습니다.
메뉴 모음에서 프로젝트, 새 항목 추가를 선택합니다.
새 항목 추가 대화 상자의 가운데 창에서 C++ 파일(.cpp)을 선택합니다. 이름 편집 컨트롤에서 확장명을 가진
.asm
새 파일 이름을 입력합니다.cpp
. 추가를 선택하여 프로젝트에 파일을 추가하고 대화 상자를 닫습니다.
추가한 파일에 어셈블러 언어 코드를 .asm
만듭니다. 솔루션을 빌드할 때 MASM 어셈블러가 호출되어 파일을 개체 파일로 어셈블 .asm
한 다음 프로젝트에 연결됩니다. 기호 액세스를 더 쉽게 하려면 어셈블러 언어 소스 파일에서 C++ 이름 장식 규칙을 사용하는 대신 C++ 소스 코드에서와 같이 extern "C"
어셈블러 함수를 선언합니다.
ml64 관련 지시문
x64를 대상으로 하는 어셈블러 언어 소스 코드에서 다음 ml64 관련 지시문을 사용할 수 있습니다.
PROC
지시문도 ml64.exe 사용하도록 업데이트되었습니다.
32비트 주소 모드(주소 크기 재정의)
메모리 피연산자에서 32비트 레지스터를 포함하는 경우 MASM은 0x67 주소 크기 재정의를 내보낸다. 예를 들어 다음 예제에서는 주소 크기 재정의를 내보냅니다.
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]
MASM은 32비트 변위가 메모리 피연산자로만 나타나는 경우 64비트 주소 지정을 가정합니다. 현재 이러한 피연산자를 사용하는 32비트 주소 지정은 지원되지 않습니다.
마지막으로 다음 코드에 설명된 대로 메모리 피연산자 내에서 레지스터 크기를 혼합하면 오류가 발생합니다.
mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]