汇编编程 - WinAsm 与 Visual Studio 2017

Gre*_*ark 10 ide assembly masm instructions visual-studio-2017

我是来问你一些关于 VS2017 的东西的。
过去,我曾将 WinAsm 用于 MASM,但从未遇到过问题。

然而,当我尝试在 VS2017 中使用 MASM 做一些事情时,我总是会遇到问题和东西......
我已经检查了整个互联网关于“如何为 MASM 设置 VS”,但没有任何帮助我,因为我总是遇到麻烦...

有没有什么方法可以将 Visual Studio 2017 用于 MASM32/64 位而不会感到头疼?

有人可以给我设置 VS2017 进行汇编编程的终极指南吗?

非常感谢您,并为我的英语不好而感到抱歉。

rkh*_*khb 9

如何使用独立的 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) 在“属性”窗口中,您必须完成两个链接器选项:

  • 入口点:main
  • 子系统:控制台 (/SUBSYSTEM:CONSOLE)

在左侧选择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 Platformsx86(上面的第 8 号)并使用SubSystem: Console (/SUBSYSTEM:CONSOLE)(上面的第 10号)完成项目属性。您不能设置入口点,因为 ml32 需要END指令 ( END main)之后的入口点。使用 .exe 构建并运行 .exe CTRL-F5