gpt4 book ai didi

汇编编程 - WinAsm 与 Visual Studio 2017

转载 作者:行者123 更新时间:2023-12-03 06:25:53 24 4
gpt4 key购买 nike

我来这里是想问你一些关于 VS2017 的事情。
过去我曾使用 WinAsm 作为 MASM,但从来没有遇到过问题。

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

有什么方法可以轻松使用 Visual Studio 2017 for MASM32/64bit 吗?

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

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

最佳答案

如何使用独立的 x64/x86 程序集文件构建 x64/x86 项目

1) 启动 Visual Studio(社区)2017 并选择 FILE - New - Project .

Screenshot

2) 在下一个窗口中选择Empty Project .

Screenshot

3) 确保该项目在解决方案资源管理器中突出显示,然后选择 PROJECT - Build Customizations... .

Screenshot

4) 在下一个窗口中勾选 masm(.targets,.props)然后点击OK .

Screenshot

5) 选择PROJECT - Add New Item从菜单中。

Screenshot

6) 在下一个窗口中选择 C++File(.cpp) - 重要! - 为其命名 .asm扩大。点击Add .

Screenshot

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://learn.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

这是一个 64 位控制台应用程序,从过程 main 启动。 .

8) 更改Solution Platforms到 x64

Screenshot

9) 选择PROJECT - Properties .

Screenshot

10) 在“属性”窗口中,您必须完成两个链接器选项:

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

选择左侧Configuration Properties - Linker - All Options ,同时更改两个选项并单击 OK

Screenshot

Screenshot

11) 使用 CTRL-F5 构建并运行 .exe。该应用程序将在新窗口中打开。

<小时/>

现在覆盖Source.asm使用 32 位控制台应用程序:

.MODEL flat, stdcall

; https://learn.microsoft.com/en-us/cpp/assembler/masm/proto
GetStdHandle PROTO STDCALL, ; https://learn.microsoft.com/en-us/windows/console/getstdhandle
nStdHandle: SDWORD
WriteFile PROTO STDCALL, ; https://learn.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://learn.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-exitprocess
dwExitCode: DWORD ; return code

.DATA ; https://learn.microsoft.com/en-us/cpp/assembler/masm/dot-data
Hallo db "Hello world!",13,10

.DATA? ; https://learn.microsoft.com/en-us/cpp/assembler/masm/dot-data-q
lpNrOfChars dd ?

.CODE ; https://learn.microsoft.com/en-us/cpp/assembler/masm/dot-code
main PROC ; learn.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://learn.microsoft.com/en-us/cpp/assembler/masm/end-masm

更改 Solution Platformsx86 (上面的第 8 条)并使用 SubSystem: Console (/SUBSYSTEM:CONSOLE) 完成项目属性。 (上面第 10 条)。您不得设置入口点,因为 ml32 期望入口点位于 END 之后。指令( END main )。使用 CTRL-F5 构建并运行 .exe。

关于汇编编程 - WinAsm 与 Visual Studio 2017,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com