NASM局部变量 - 事实上它们是全局宏吗?

时间:2017-09-21 18:01:04

标签: macros nasm

我一直在NASM中使用%local指令来定义局部变量,从而避免一直输入[ebp - 8][ebp - 24]等。

但是,我注意到在预处理器上下文local%push之间的一个函数中定义的%pop变量在其余代码中仍然可用,这可能导致意外解析错误。

在这里,我写了一个证明问题的最小例子:

    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之后仍然可用。这对我来说不是很本地化!我希望NASM在执行width时取消定义%pop

有没有办法使用%local但避免这些泄漏的宏?目前,它们是一个简单的%define声明,令人困惑。

0 个答案:

没有答案