如何在 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
在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