Macros NASM局部变量——它们实际上是全局宏吗?
我一直在使用NASM中的Macros NASM局部变量——它们实际上是全局宏吗?,macros,nasm,Macros,Nasm,我一直在使用NASM中的%local指令来定义局部变量,从而避免一直键入[ebp-8],[ebp-24]等 但是,我注意到,在预处理器上下文%push和%pop之间的一个函数中定义的local变量在代码的其余部分仍然可用,这可能会导致意外的解析错误 在这里,我写了一个简单的例子来说明这个问题: struc Rect .left resd 1 .top resd 1
%local
指令来定义局部变量,从而避免一直键入[ebp-8]
,[ebp-24]
等
但是,我注意到,在预处理器上下文%push
和%pop
之间的一个函数中定义的local
变量在代码的其余部分仍然可用,这可能会导致意外的解析错误
在这里,我写了一个简单的例子来说明这个问题:
struc Rect
.left resd 1
.top resd 1
.width resd 1
.height resd 1
endstruc
%define RECT(x) g_rect + Rect. %+ x
segment .bss
g_rect resd 4
segment .text
; ================================================
function1:
%push
%stacksize flat
%assign %$localsize 0
%local width:dword ; defines local var "width"
push ebp
mov ebp, esp
sub esp, 4
pusha
; ...
popa
leave
ret
%pop
; ================================================
function2:
push ebp
mov ebp, esp
pusha
; ...
mov eax, RECT(height) ; OK
mov ebx, RECT(width) ; Parse error
; ...
popa
leave
ret
确切的错误是:
nasm -f elf -d ELF_TYPE -g test.asm
test.asm:42: error: comma, colon, decorator or end of line expected after operand
显然,这是因为width
被其他东西替代了,如果我删除本地参数定义,问题就会消失
如您所见,变量width
在%pop
之后仍然可用。对我来说,这看起来不太本地化!当执行%pop
时,我希望NASM取消定义宽度
有没有一种方法可以使用%local
但避免这些泄漏的宏?目前,它们充当一个简单的%define
语句,令人困惑。发布您收到的错误。@FrankC。完成。尽管发现了缺陷,但不要认为确切的错误是相关的。最简单的解决方法是为%local使用与全局名称不冲突的唯一名称,其他名称包括(以最丑陋的顺序)逐字段创建直接引用宏(即%define RECTW g_rect+rect.width
停止使用rect宏。。。