如何在 gas 的宏 asm 中声明局部变量,例如在 nasm 的宏 asm 中使用 %local 在宏 asm 中声明它,或者在 masm 的宏 asm 中声明局部变量?

How to declare local variables in macro asm of gas like decalaring it in macro asm with %local in macro asm of nasm or local in macro asm of masm?

在nasm的宏asm中声明局部变量的方式是:%localold_ax:word,在masm的宏asm中声明局部变量的方式是like:localold_ax:WORD,那么在gas的宏asm中声明局部变量的方法是什么?

gas 主要用作编译器后端,不供人类使用。因此,它缺少一些功能,其中包括此功能。您当然可以尝试制作一个宏来执行此操作,大致如下:

.intel_syntax noprefix
.globl main

.macro local head, tail:vararg
# assume dwords for simplicity
.set localsize, localsize + 4
.set \head, -localsize
.ifnb \tail
local \tail
.endif
.endm

main:
    .set localsize, 0
    local old_ax, old_dx
    enter localsize, 0
    mov [ebp+old_ax], ax
    mov [ebp+old_dx], dx
    leave
    ret

但一般来说,你可以直接使用等式来计算堆栈偏移量,例如:

main:
    .set old_ax, 4
    .set old_dx, 0
    sub esp, 8
    mov [esp+old_ax], ax
    mov [esp+old_dx], dx
    add esp, 8
    ret