You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NASM中出现“error: parser: instruction expected”宏错误求助

解决NASM宏"error: parser: instruction expected"错误

嘿,这个问题我之前也踩过坑!核心原因很简单——NASM要求宏必须在被调用之前定义,你现在的代码里WSTRING宏是在调用它之后才声明的,汇编器扫描到WSTRING那行时,根本不知道这是个宏,会把它当成一条汇编指令来解析,自然就抛出"instruction expected"的错误了,不管你传的是字符串字面量还是标签,这个顺序问题才是根源。

先给你修正后的正确代码,我们一步步看:

首先,把宏定义移到所有调用之前,同时保留你第二种写法里的字符串标签(因为直接传字面量给mov si是错误的,si需要的是字符串的内存地址,不是字面量本身):

Bits 16
; 先定义宏,确保调用前汇编器能识别它
%MACRO WSTRING 1
    mov si, %1
    call print
%ENDMACRO

; 定义字符串常量,末尾的0是print函数需要的终止符
MSG DB 'MESSAGE',0

call clear_screen
WSTRING MSG  ; 现在宏已经定义,传入正确的内存标签
jmp $

再给你拆解下关键注意点:

  • NASM的宏是在预处理阶段处理的,汇编器是从上到下逐行扫描代码的,遇到未定义的宏会直接报错,不会回溯查找后续的定义。
  • 你第一次尝试的WSTRING 'MESSAGE'还有个额外问题:mov si, 'MESSAGE'会把字符串字面量的ASCII值直接加载到si寄存器里,这不是你想要的效果——print函数应该是通过si指向的内存地址读取字符串,所以必须用标签传递地址。
  • 如果你的宏需要在多个汇编文件里复用,建议把宏放在单独的.inc文件中,然后在代码开头用%include "your_macros.inc"引入,这样能更方便地管理宏定义,避免顺序问题。

内容的提问来源于stack exchange,提问作者Lunar Lunatic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:09:35