在汇编中定义调试宏(使用 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
为了在调试器之外进行调试,我通常会添加基本的打印语句,例如:
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