在汇编中定义调试宏(使用 gas?)

Defining a debugging macro in assembly (with gas?)

为了在调试器之外进行调试,我通常会添加基本的打印语句,例如:

    str: .string "Hello!\n"

    mov ,     %rdi
    mov $str,   %rsi
    mov ,     %rdx
    mov ,     %eax
    syscall

有没有办法创建一个宏,我可以这样写:

print ($str, )

它会自动扩展为:

mov ,     %rdi
mov ,     %eax
mov $str,   %rsi
mov ,     %rdx
syscall

我查看了有关 gas 的 macro 文档,但似乎它使用的语法我不确定它的定义位置(好像他们正在使用 for 循环?)。是否可以在 asm 中执行上述操作?我想如果不是的话我可以在 vim 中创建一个片段 'expand' 到上面。


感谢您的建议。我用来打印上面的测试宏是:

.macro DEBUG str_addr, str_len
    mov ,         %edi
    mov $\str_addr, %rsi
    mov $\str_len,  %edx
    mov ,         %eax
    syscall
.endm

DEBUG str, 7

虽然语法有点奇怪,但对于 'normal instruction'(而不是循环或条件,例如),宏语法称为:

macro arg1, arg2

并定义为:

.macro <macro_name> <arg1>, <arg2>, ...

.endm

变量名需要用\转义。因此,例如要引用 arg1,您必须执行 \arg1.

当然可以。你应该可以做这样的事情(我手头没有汽油,所以未经测试):

.macro myprint s, len
    mov ,     %rdi
    mov $\s,    %rsi
    mov $\len,  %rdx
    mov ,     %eax
    syscall
.endm

那么你可以这样称呼它:

 myprint str, 7