使用GNU汇编器宏的“表达式后垃圾”

时间:2018-07-09 06:55:33

标签: assembly macros x86 preprocessor gas

我大致遵循this guide来设置简单的操作系统。它提供了一些用于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_int_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_error_code_handler 0行说到错误

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

即使类型的行为不像普通函数,它与将类型定义为函数有关系吗?自从.exitm指令离开后,我应该在某个地方使用iret吗?

1 个答案:

答案 0 :(得分:1)

以下几行引起了错误

push dword 0
push dword \num

dword在这种情况下无效。

push 0
push \num

删除dword解决了问题