Gre*_*ark 10 ide assembly masm instructions visual-studio-2017
我是来问你一些关于 VS2017 的东西的。
过去,我曾将 WinAsm 用于 MASM,但从未遇到过问题。
然而,当我尝试在 VS2017 中使用 MASM 做一些事情时,我总是会遇到问题和东西......
我已经检查了整个互联网关于“如何为 MASM 设置 VS”,但没有任何帮助我,因为我总是遇到麻烦...
有没有什么方法可以将 Visual Studio 2017 用于 MASM32/64 位而不会感到头疼?
有人可以给我设置 VS2017 进行汇编编程的终极指南吗?
非常感谢您,并为我的英语不好而感到抱歉。
如何使用独立的 x64/x86 程序集文件构建 x64/x86 项目
1) 启动 Visual Studio (Community) 2017 并选择FILE - New - Project
.
2) 在下一个窗口中选择Empty Project
。
3) 确保该项目在解决方案资源管理器中突出显示,然后选择PROJECT - Build Customizations...
。
4) 在下一个窗口中勾选masm(.targets,.props)
并单击OK
。
5)PROJECT - Add New Item
从菜单中选择。
6) 在下一个窗口中选择C++File(.cpp)
和 -重要!- 给它一个带有.asm
扩展名的名称。单击Add
。
7) 现在您可以用内容填充文件。
来源.asm:
EXTERN GetStdHandle : PROC
EXTERN WriteFile : PROC
EXTERN ExitProcess : PROC
.DATA?
hFile QWORD ?
BytesWritten DWORD ?
.DATA
hello BYTE 'Hello world!', 13, 10
.CODE
main PROC
; https://blogs.msdn.microsoft.com/oldnewthing/20160623-00/?p=93735
sub rsp, 40 ; Shadow space (4 * 8) & 1 parameter (8 bytes)
; https://docs.microsoft.com/en-us/cpp/build/stack-allocation
and spl, -16 ; Align to 16
; https://msdn.microsoft.com/library/windows/desktop/ms683231.aspx
mov ecx, -11 ; DWORD nStdHandle = STD_OUTPUT_HANDLE
call GetStdHandle ; Call WinApi
mov hFile, rax ; Save returned handle
; https://msdn.microsoft.com/library/windows/desktop/aa365747.aspx
mov rcx, hFile ; HANDLE hFile (here: Stdout)
lea rdx, hello ; LPCVOID lpBuffer
lea r9, BytesWritten ; LPDWORD lpNumberOfBytesWritten
mov r8d, LENGTHOF hello ; DWORD nNumberOfBytesToWrite
mov qword ptr [rsp+32], 0 ; LPOVERLAPPED lpOverlapped = NULL
call WriteFile ; Call WinAPI
exit:
; https://msdn.microsoft.com/library/windows/desktop/ms682658.aspx
xor ecx, ecx ; Set RCX to null for return value
call ExitProcess ; Call WinAPI to exit
main ENDP
end
Run Code Online (Sandbox Code Playgroud)
这是一个 64 位控制台应用程序,从程序 开始main
。
8) 更改Solution Platforms
为 x64
9) 选择PROJECT - Properties
。
10) 在“属性”窗口中,您必须完成两个链接器选项:
在左侧选择Configuration Properties - Linker - All Options
,同时更改两个选项并单击OK
。
11) 使用 .exe 构建并运行 .exe CTRL-F5。该应用程序将在新窗口中打开。
现在Source.asm
用 32 位控制台应用程序覆盖:
.MODEL flat, stdcall
; https://docs.microsoft.com/en-us/cpp/assembler/masm/proto
GetStdHandle PROTO STDCALL, ; https://docs.microsoft.com/en-us/windows/console/getstdhandle
nStdHandle: SDWORD
WriteFile PROTO STDCALL, ; https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-writefile
hFile: DWORD, ; output handle
lpBuffer: PTR BYTE, ; pointer to buffer
nNumberOfBytesToWrite: DWORD, ; size of buffer
lpNumberOfBytesWritten: PTR DWORD, ; num bytes written
lpOverlapped: PTR DWORD ; ptr to asynchronous info
ExitProcess PROTO STDCALL, ; https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-exitprocess
dwExitCode: DWORD ; return code
.DATA ; https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-data
Hallo db "Hello world!",13,10
.DATA? ; https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-data-q
lpNrOfChars dd ?
.CODE ; https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-code
main PROC ; docs.microsoft.com/en-us/cpp/assembler/masm/proc
invoke GetStdHandle, -11 ; -> StdOut-Handle into EAX
invoke WriteFile, eax, OFFSET Hallo, LENGTHOF Hallo, OFFSET lpNrOfChars, 0
invoke ExitProcess, 0
main ENDP
END main ; https://docs.microsoft.com/en-us/cpp/assembler/masm/end-masm
Run Code Online (Sandbox Code Playgroud)
将其更改Solution Platforms
为x86
(上面的第 8 号)并使用SubSystem: Console (/SUBSYSTEM:CONSOLE)
(上面的第 10号)完成项目属性。您不能设置入口点,因为 ml32 需要END
指令 ( END main
)之后的入口点。使用 .exe 构建并运行 .exe CTRL-F5。