本文介绍使用Visual Studio 2022的MASM开发x64汇编程序hello world的环境配置和汇编代码,作为学习CPU指令的起点。分两个版本的hello world, 一个是console版本,另一个是windows版本。
首先安装visual studio community 2022,下载地址 https://visualstudio.microsoft.com/,安装时选择C++开发模块
安装好以后新建项目,项目类型选择C++ console empty project
创建好项目以后右击项目,点击生成依赖项,生成自定义,勾选masm,确定
接下来添加汇编源文件,在项目的源文件上右击添加新项目,选择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 窗口。
接下来我们看一下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
当我们在汇编代码中设置一个断点,然后开始调试,在这个断点停下时,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