• 汇编语言非双字局部变量

    在声明不同大小的局部变量时,LOCAL 伪指令的操作会变得很有趣。每个变量都按照其大小来分配空间:8 位的变量分配给下一个可用的字节,16 位的变量分配给下一个偶地址(字对齐),32 位变量分配给下一个双字对齐的地址。

    现在来看几个例子。首先,Example 过程含有一个局部变量 var1,类型为 BYTE:

    Example1 PROC
        LOCAL var1:byte
        mov al,var1       ;[EBP-1]
        ret
    Example1 ENDP

    由于 32 位模式中,堆栈偏移量默认为 32 位,因此,var1 可能被认为会存放于 EBP-4 的位置。实际上,如下图所示,MASM 将 EBP 减去 4,但是却把 var1 存放在 EBP-1,其下面的三个字节并未使用(用 nu 标记,表示没有使用)。图中,每个方块表示一个字节。

    为局部变量保留空间

更多...

加载中...