I want to create a macro like the following:
.altmacro
.macro assert_eq a, b=%eax
LOCAL ok
#...
.endm
To be used as:
assert_eq $1
assert_eq $1, %eax
I want .altmacro
for LOCAL
(I see the other possibility of using \@
, but I want LOCAL
).
But when I try to compile this I get:
Error: % operator needs absolute expression
I am guessing that this problem is created by the fact that b=%eax
is attempting to use another feature enabled by .altmacro
: Expression results as strings,
since without .altmacro
I could write this without problem.
If this is true, how do I escape that for my macro to work? If not, what is wrong with my code?
Bonus question: how to use %
?
GAS version: 2.23.52
I have run into a very similar problem where I wanted to pass registers as arguments to a macro that required the use .altmacro. The fix that worked was to enclose the registers in <> and place ! before %. So try changing your macro to be
and if you ever want to call your macro with a register as an argument do
With
.altmacro
, any parameter passed or default with a percent%
gets treated as an expression.Sample usage:
To prevent that expansion from happening, we have to do as mentioned by mfbutner:
Since this expansion happens only to arguments, not inside the macro itself, one alternative if we are sure that the argument is a register, is to put the percent inside the macro:
But this has the downside that we cannot pass immediates like
$1
anymore:This is to me a huge turnoff to using
.altmacro
, as it requires callers to use extra noise on every call...