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

NASM中在%rep段创建标签失败问题咨询

中断包装器宏定义错误分析与修复

需求与期望生成代码

你期望生成的汇编代码如下:

irq_wrapper_0:         ; The code of each irq_wrapper is similar and not shown
irq_wrapper_1:
irq_wrapper_2:  
irq_wrapper_3:

...

irq_wrapper_array:
  dd irq_wrapper_0
  dd irq_wrapper_1
  dd irq_wrapper_2
  dd irq_wrapper_3

现有问题代码

你编写的代码无法正常工作,代码如下:

%define MyMacro(id) irq_wrapper_ +% id  

%assign id 0
%rep 4               
  MyMacro(id) :     
  %assign id id+1
%endrep

...

irq_wrapper_array: 
%assign id 0
%rep 4               
  dd MyMacro(id)    
  %assign id id+1
%endrep

补充说明

  • 上述代码为节选
  • 实际需要处理的向量数量超过4个
  • 希望通过预处理器避免手动展开的错误

问题

请问我的代码存在什么错误,以及无法正常运行的原因是什么?


错误原因与修复方案

你的宏定义写法完全错误:irq_wrapper_ +% id 会被NASM预处理器解析成将符号irq_wrapper_的地址与数值id做加法运算,而不是把irq_wrapper_和id拼接成新的符号名,这和你想要生成irq_wrapper_0这类标签的需求完全不符。

要实现符号名的拼接,NASM需要用%+操作符来连接字符串和数值。正确的宏定义应该是:

%define MyMacro(id) irq_wrapper_%+id

修正后的完整代码如下:

%define MyMacro(id) irq_wrapper_%+id  

%assign id 0
%rep 4               
  MyMacro(id):     
  %assign id id+1
%endrep

...

irq_wrapper_array: 
%assign id 0
%rep 4               
  dd MyMacro(id)    
  %assign id id+1
%endrep

这样预处理器就能正确生成irq_wrapper_0、irq_wrapper_1这类标签,以及数组中对应的符号引用,完全符合你的预期。

内容的提问来源于stack exchange,提问作者40tude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:17:45