为什么是NASM?
想学汇编的同学们肯定会疑惑,为什么是NASM,不是MASM?
那当然是因为:
- 原生支持 Windows、Linux、macOS、DOS 等多个操作系统;
- 语法清晰易读
废话少说,我们先来配置环境
NASM下载
需要安装nasm,这边我就不讲了,大家可以网上搜
别忘了加入PATH!
语法高亮插件安装
经过尝试,这一款比较好:

配置Code Runner
先下载Code Runner插件,然后,我们需要配置:
- 点管理按钮,再点设置

- 设置在终端中运行

- 编辑setting.json(注意是第二幅图的那个)

然后有两种选择:
如果安装了Visual Studio,可输入一行:
".asm": "cd $dir && nasm -f win64 $fileName -o $fileNameWithoutExt.obj && link /subsystem:console /entry:main $fileNameWithoutExt.obj kernel32.lib && $fileNameWithoutExt.exe",
(会找不到lib库,解决方案以后讲,建议使用方案2)
使用Golink
- 下载 Golink(一个单独 exe,无需安装)。
- 将 golink.exe 放到 C:\Windows\System32 或项目目录。
- 修改 Code Runner 的 .asm 映射为:
".asm": "cd $dir && nasm -f win64 $fileName -o $fileNameWithoutExt.obj && golink /entry:main $fileNameWithoutExt.obj kernel32.dll /console && ./$fileNameWithoutExt.exe",
运行你的第一个NASM汇编程序
激不激动,让我们来输出祖传的Hello,world!
; ----------------------------------------------------------------------------------------
; 使用 Windows API 将 "Hello,World" 写入控制台。适用于 Windows x64。
; 编译链接命令(需安装 NASM 和 Golink / Microsoft Link):
; nasm -f win64 hello.asm && golink hello.obj kernel32.dll /console
; 或
; nasm -f win64 hello.asm && link /subsystem:console hello.obj kernel32.lib
; ----------------------------------------------------------------------------------------
global main ; 入口点通常命名为 main(或 WinMain)
extern GetStdHandle ; 从 kernel32.dll 导入
extern WriteConsoleA ; 写入控制台
extern ExitProcess ; 退出进程
section .data
msg: db "Hello,World", 10 ; 要输出的字符串,含换行符
len equ $ - msg ; 计算字符串长度
section .text
main:
sub rsp, 40 ; 为 x64 调用约定预留阴影空间(32 字节)+ 对齐(8 字节)
; 获取标准输出句柄(STD_OUTPUT_HANDLE = -11)
mov ecx, -11
call GetStdHandle
; 准备调用 WriteConsoleA( hConsole, lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, lpReserved )
mov rcx, rax ; 第1参数:句柄
lea rdx, [msg] ; 第2参数:字符串地址
mov r8d, len ; 第3参数:要写入的字符数
lea r9, [rsp + 40] ; 第4参数:指向接收实际写入字节数的变量(这里借用了预留空间上方)
mov qword [rsp + 32], 0 ; 第5参数:lpReserved 必须为 NULL
call WriteConsoleA
; 退出进程,返回码 0
xor ecx, ecx ; 退出码 0
call ExitProcess

恭喜!汇编系列会继续更新的!
评论 · 0