我一直在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
声明,令人困惑。