For debugging outside a debugger, I'll often add in basic print statements, for example something like:
str: .string "Hello!\n"
mov $1, %rdi
mov $str, %rsi
mov $7, %rdx
mov $1, %eax
syscall
Is there a way to create a macro where I can instead write it like:
print ($str, $7)
And it would automatically expand to:
mov $1, %rdi
mov $1, %eax
mov $str, %rsi
mov $7, %rdx
syscall
I've looked at the macro
docs for gas but it seems like it's using a syntax that I'm not sure where it's defined (it seems like they are using for loops?). Would it be possible to do the above in asm? I suppose if not I could create a snippet in vim that would 'expand' to the above.
Thanks for the suggestion. The tested macro I used to print the above is:
.macro DEBUG str_addr, str_len
mov $1, %edi
mov $\str_addr, %rsi
mov $\str_len, %edx
mov $1, %eax
syscall
.endm
DEBUG str, 7
While the syntax is a bit odd, for 'normal instruction' (and not a loop or conditional, for example), the macro syntax is called as:
macro arg1, arg2
And defined as:
.macro <macro_name> <arg1>, <arg2>, ...
.endm
Variable names need to be escaped with \
. So for example to reference arg1
you have to do \arg1
.
Sure. You should be able to do something like this (I don't have gas handy, so it's untested):
.macro myprint s, len
mov $1, %rdi
mov $\s, %rsi
mov $\len, %rdx
mov $1, %eax
syscall
.endm
Then you'd call it like this:
myprint str, 7