Visual Studio 2022 MASM x64汇编hello world以及调试(Console版 + Windows版)

本文介绍使用Visual Studio 2022的MASM开发x64汇编程序hello world的环境配置和汇编代码,作为学习CPU指令的起点。分两个版本的hello world, 一个是console版本,另一个是windows版本。

第1步: 安装

首先安装visual studio community 2022,下载地址 https://visualstudio.microsoft.com/,安装时选择C++开发模块

第2步:新建项目,配置项目

安装好以后新建项目,项目类型选择C++  console  empty project

创建好项目以后右击项目,点击生成依赖项,生成自定义,勾选masm,确定

第3步:Windows版的hello world

接下来添加汇编源文件,在项目的源文件上右击添加新项目,选择C++文件,但是文件名使用.asm扩展名

然后在asm文件中填入代码:

extrn MessageBoxA: proc

;64位没有 .model 宏指令,不能指定内存模型和调用约定

.data
text db 'Hello World', 0
caption db 'Selph First x64 Application', 0

.code
WinMain proc
sub rsp,28h ; 函数调用前需要预留影子空间,对齐rsp
xor r9d,r9d
lea r8, caption
lea rdx, text
xor rcx,rcx
call MessageBoxA ; 函数调用使用fastcall
add rsp,28h
WinMain ENDP
END ; 最后直接end,不用指明符号

设置项目的类型为windows:右击项目,属性,链接器,系统,在子系统里选择窗口(/subsystem:windows)

并在链接器,高级里设置入口为WinMain

然后编译生成项目,生成前确保工具栏显示的是 debug - x64,运行生成出来的exe文件会看到弹出hello world 窗口。

第4步:Console版的hello world

接下来我们看一下console版的Hello world

将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

在项目,属性,链接器,系统,在子系统里选择控制台(/subsystem:console)

在链接器,高级里设置入口为main

右击项目,调试,调试前确保工具栏显示的是 debug - x64,会看到在控制台输出hello world

第5步:调试汇编程序

当我们在汇编代码中设置一个断点,然后开始调试,在这个断点停下时,visual studio的调试菜单的窗口里会多出一些选项,比如寄存器、反汇编、内存,点击寄存器,会显示出寄存器的值,点击反汇编,会在源代码中显示相应的机器码,点击内存能看到内存的内容,这些信息将帮助我们方便地调试。

参考资料

在win10 64位系统上使用visual studio2019创建汇编asm程序工程_enderwsp的博客-CSDN

https://blog.csdn.net/Ender__/article/details/93884634

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_〇VEA的博客-CSDN博客_x64汇编书籍

https://blog.csdn.net/Alisebeast/article/details/79875620

使用VS2022编写x64汇编程序 - 我可是会飞的啊 (kn0sky.com)

https://www.kn0sky.com/?p=112

https://stackoverflow.com/questions/52796300/assembly-programming-winasm-vs-visual-studio-2017

你可能感兴趣的:(visual,studio,windows,microsoft)