Assembly &引用;“表达后的垃圾”;使用GNU汇编宏

Assembly &引用;“表达后的垃圾”;使用GNU汇编宏,assembly,macros,x86,preprocessor,gnu-assembler,Assembly,Macros,X86,Preprocessor,Gnu Assembler,我大致上是在安装一个简单的操作系统。它提供了一些用于NASM的程序集,但我使用的是GNU汇编程序 在我正在使用的程序集文件的顶部 .intel_syntax noprefix 我定义了这样一个宏 .macro no_error_code_handler num .global interrupt_handler_\num .type interrupt_handler_\num, @function interrupt_handler_\num: push dword 0 pu

我大致上是在安装一个简单的操作系统。它提供了一些用于NASM的程序集,但我使用的是GNU汇编程序

在我正在使用的程序集文件的顶部

.intel_syntax noprefix
我定义了这样一个宏

.macro no_error_code_handler num
.global interrupt_handler_\num
.type interrupt_handler_\num, @function
interrupt_handler_\num:
    push dword 0
    push dword \num
    jmp common_int_handler
.endm
如果重要的话,
common\u int\u handler
被定义为

common_int_handler:
    pushad
    call int_handler # This is a C function
    popad
    add esp, 8
    iret
最后,我有一句台词

no_error_code_handler 0
我希望它能扩展到

.global interrupt_handler_0
.type interrupt_handler_0, @function
interrupt_handler_0:
    push dword 0
    push dword 0
    jmp common_int_handler
编译时,我从
no\u error\u code\u处理程序0
行中得到一个错误

Assembler messages:
Error: junk `0' after expression
Error: junk `0' after expression

它是否与将类型定义为函数有关,即使它的行为与普通函数不同?在执行完
iret
指令后离开后,我是否应该在某个地方使用
.exitm

push dword 0
push dword \num
dword
在此上下文中无效

push 0
push \num

删除dword解决了问题

这不是因为您指定了
。英特尔语法noprefix
。这也不是AT&t的有效语法。GAS的intel_语法模式与NASM不同;它更像MASM。为了提高效率,您只需要保存/恢复被调用的寄存器。编译器生成的函数已将保留调用的regs保留为调用约定的一部分。在调用C代码(function
int\u handler
)之前,中断代码也缺少
CLD
指令。您必须确保为字符串指令设置了前进方向标志。如果被中断的代码碰巧发出了
STD
指令,并且中断代码使用了x86字符串指令,则代码中断可能无法按预期工作。