文章

NASM+VS Code汇编环境配置

🤖AI 摘要
本文介绍在VS Code中配置NASM汇编开发环境的步骤。要点包括:安装NASM并加入PATH、安装语法高亮插件、配置Code Runner插件以支持编译运行,推荐使用Golink替代MSVC链接器以避免库路径问题。最后提供一个Hello,World示例程序,演示x64 Windows下的汇编编写与执行。关键词:NASM、VS Code、Code Runner、Golink、汇编配置。
首访生成,后台可强制重算

为什么是NASM?

想学汇编的同学们肯定会疑惑,为什么是NASM,不是MASM?

那当然是因为:

  1. 原生支持 Windows、Linux、macOS、DOS 等多个操作系统;
  2. 语法清晰易读

废话少说,我们先来配置环境

NASM下载

需要安装nasm,这边我就不讲了,大家可以网上搜

别忘了加入PATH!

语法高亮插件安装

经过尝试,这一款比较好:

配置Code Runner

先下载Code Runner插件,然后,我们需要配置:

  1. 点管理按钮,再点设置
  2. 设置在终端中运行
  3. 编辑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(一个单独 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

评论功能已关闭。
还没有评论,来当第一个吧。