汇编语言LOCAL伪指令:声明一个或多个变量名


不难想象,Microsoft 创建 LOCAL 伪指令是作为 ENTER 指令的高级替补。LOCAL 声明一个或多个变量名,并定义其大小属性。(另一方面,ENTER 则只为局部变量保留一块未命名的堆栈空间。)如果要使用 LOCAL 伪指令,它必须紧跟在 PROC 伪指令的后面。

其语法如下所示:

LOCAL varlist

varlist 是变量定义列表,用逗号分隔表项,可选为跨越多行。每个变量定义采用如下格式:

label:type

其中,标号可以为任意有效标识符,类型既可以是标准类型(WORD、DWORD 等),也可以是用户定义类型。

【示例】MySub 过程包含一个局部变量 var1,其类型为 BYTE:

MySub PROC
LOCAL var1:BYTE

BubbleSort 过程包含一个双字局部变量 temp 和一个类型为 BYTE 的 SwapFlag 变量:

BubbleSort PROC
LOCAL temp:DWORD, SwapFlag:BYTE

Merge 过程包含一个类型为 PTR WORD 的局部变量 pArray,它是一个 16 位整数的指针:

Merge PROC
LOCAL pArray:PTR WORD

局部变量 TempArray 是一个数组,包含 10 个双字。请注意用方括号显示数组大小:

LOCAL TempArray[10]:DWORD

MASM 代码生成

使用 LOCAL 伪指令时,查看 MASM 生成代码是有好处的。下面的过程 Example1 有一个双字局部变量:
Example1 PROC
    LOCAL temp:DWORD

    mov eax,temp
    ret
Example1 ENDP
MASM 为 Example1 生成如下代码,展示了 ESP 怎样减去 4,以便为双字变量预留空间:
push ebp
mov ebp, esp
add esp, OFFFFFFFCh     ;ESP 加 -4
mov eax, [ebp-4]
leave
ret
Example1 的堆栈帧示意图如下所示: