Macros NASM局部变量——它们实际上是全局宏吗?

Macros NASM局部变量——它们实际上是全局宏吗?,macros,nasm,Macros,Nasm,我一直在使用NASM中的%local指令来定义局部变量,从而避免一直键入[ebp-8],[ebp-24]等 但是,我注意到,在预处理器上下文%push和%pop之间的一个函数中定义的local变量在代码的其余部分仍然可用,这可能会导致意外的解析错误 在这里,我写了一个简单的例子来说明这个问题: struc Rect .left resd 1 .top resd 1

我一直在使用NASM中的
%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宏。。。