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
相关产品推荐
相关产品推荐

