I searched and found I can not use __asm
in x64 in visual studio. Instead I have to use an external assembly file.
How can I add external assembly file
How to build a mixed-source x64-project with a x64 assembly file in Visual Studio:
1) Start Visual Studio (Community) 2015 and choose FILE - New - Project
.
2) In the next window choose Win 32 Console Application
.
3) You get a confirmation. Click on Next >
.
4) In the next window you can accept the default settings. Click on Finish
.
5) Make sure, that the project is highlighted in the Solution Explorer and and choose PROJECT - Build Customizations...
from the menu.
6) In the next window tick masm(.targets,.props)
and click on OK
.
7) Choose Build - Configuration Manager...
8) Change the Active solution platform
to x64
9) Create callee.asm: PROJECT - Add New Item
.
10) In the next window choose C++File(.cpp)
and - IMPORTANT! - give it a name with an .asm
extension. Click on Add
.
10) Now check if the .asm
file has the right properties. In the Solution Explorer right-click on the file and choose Properties
.
11) In the Property Page you should see at least:
Excluded From Build (empty) or No
Item Type Microsoft Macro Assembler
Under Command Line
ensure that ml64.exe
is chosen as the assembler.
Click on OK
.
12) Now you can fill the files with content.
ConsoleApplication1.cpp:
#include <iostream>
using namespace std;
extern "C" void hello_from_asm();
int main()
{
cout << "Hello from CPP" << endl;
hello_from_asm();
return 0;
}
callee.asm:
PUBLIC hello_from_asm
EXTERN puts:PROC
.data
hello1 db "Hello from ASM.",0
.code
hello_from_asm PROC
push rbp
mov rbp, rsp
sub rsp, 32 ; Shadow Space
and spl, -16 ; Align stack at 16
lea rcx, hello1
call puts
leave ; Restore stack (rsp) & frame pointer (rbp)
ret
hello_from_asm ENDP
END
13) Build the .exe
and run it with CTRL-F5.
The application will be opened in a new window.