1

我想创建一个如下所示的宏:

.altmacro

.macro assert_eq a, b=%eax
    LOCAL ok
    #...
.endm

用作:

assert_eq $1
assert_eq $1, %eax

我想要.altmacroLOCAL我看到使用的另一种可能性\@,但我想要LOCAL)。

但是当我尝试编译它时,我得到:

Error: % operator needs absolute expression

我猜这个问题是由于b=%eax试图使用另一个启用的特性造成的.altmacroExpression results as strings,因为没有.altmacro我可以毫无问题地写这个。

如果这是真的,我如何逃避它以使我的宏工作?如果没有,我的代码有什么问题?

奖金问题:如何使用%

GAS 版本:2.23.52

4

3 回答 3

1

我遇到了一个非常类似的问题,我想将寄存器作为参数传递给需要使用 .altmacro 的宏。有效的解决方法是将寄存器括在 <> 中并放置 ! 前 %。所以尝试将你的宏更改为

.macro assert_eq a, b=<%eax>

如果你想用寄存器作为参数调用你的宏

assert_eq <%eax>, <%ecx>
于 2014-11-01T01:05:41.550 回答
1

使用.altmacro,任何传递的参数或带有百分比的默认参数%都将被视为表达式。

示例用法:

.altmacro

.macro PERCENT x
    mov $\x, %eax
.endm
mov $0, %eax
PERCENT %1+1
/* eax == 2 */

.macro PERCENT_DEFAULT x=%1+1
    mov $\x, %eax
.endm
mov $0, %eax
PERCENT_DEFAULT 1
/* eax == 1 */
PERCENT_DEFAULT
/* eax == 2 */

为了防止这种扩展发生,我们必须按照mfbutner 所述进行

.altmacro

.macro PERCENT x
    mov \x, %eax
.endm
PERCENT <%ebx>

.macro PERCENT_DEFAULT x=<%ebx>
    mov \x, %eax
.endm
PERCENT_DEFAULT

由于这种扩展只发生在参数上,而不是宏本身,如果我们确定参数是一个寄存器,另一种选择是将百分比放在宏内:

.macro PERCENT_ESCAPE_REG x
    mov %x, %eax
.endm
mov $0, %eax
mov $1, %ebx
PERCENT_ESCAPE_REG ebx
/* eax == 1 */

但这有一个缺点,我们不能再像这样传递立即数$1了:

PERCENT_ESCAPE_REG $1

This is to me a huge turnoff to using .altmacro, as it requires callers to use extra noise on every call...

于 2015-09-23T10:10:55.747 回答
1

You can add

.att_syntax noprefix

and than call the macro as

assert_eq $1, eax
于 2019-03-31T09:52:34.517 回答