装配中的动态变量创建? (x86 程序集)

Dynamic Variable creation in assembly? (x86 Assembly)

假设我的汇编代码中有一个 PROC,如下所示:

.CODE
PROC myProc
MOV EAX, 00000001
MOV EBX, 00001101
RET
ENDP myProc

我想在我的程序中将 1 移动到 EAX 寄存器,并将 13 移动到 EBX 寄存器,但是我想创建两个本地变量到我的 PROC,为 var a 分配值 1,为 var b 13 的值,然后从那里将 [a] 移动到 EAX,并将 [b] 移动到 EBX。我之前对此有很多想法,也许在堆栈上为变量创建 space,或者类似的东西:

.CODE
PROC myProc
PUSH ESP
PUSH EBP
MOV ESP, 00000001
MOV EBP, 00001101
MOV EAX, [ESP]
MOV EBX, [EBP]
ENDP myProc

但这仍然不是动态变量创建,我只是在寄存器之间来回写入和读取数据。所以本质上我试图弄清楚如何在 运行 时间在程序集中创建变量。如果有任何帮助,我将不胜感激。

变量是一个高级概念。 C 函数的 asm 实现通常会有一个变量在某些时候存在于寄存器中,但在其他时候它可能存在于不同的寄存器中,或者在不再需要时存在于某个位置的内存中(或者你 运行 超出寄存器)。

在 asm 中,您实际上没有变量(静态存储除外),除非使用注释来跟踪什么意思。只需四处移动数据并产生有意义的结果。

尽可能避免记忆。查看 C 编译器输出:任何体面的编译器都会尽可能地将所有内容保存在寄存器中。

int foo(int a, int b) {
  int c = a + 2*b;
  int d = 2*a + b;
  return c + d;
}

此函数使用 gcc6.2 -O3 -fverbose-asm (on the Godbolt compiler explorer) 编译为以下 32 位代码。请注意 gcc 如何将变量名附加到带有注释的寄存器中。

    mov     ecx, DWORD PTR [esp+4]    # a, a
    mov     edx, DWORD PTR [esp+8]    # b, b
    lea     eax, [ecx+edx*2]  # c,
    lea     edx, [edx+ecx*2]  # d,
    add     eax, edx  # tmp94, d
    ret

您似乎在使用 MASM 语法。创建局部变量的标准 MASM 方法是

.CODE
  PROC myProc
    LOCAL a: DWORD
    LOCAL b: DWORD
    ; Initialize those vars
    MOV a, 00000001
    MOV b, 00001101
    RET
  ENDP myProc

LOCAL 指令使用 EBP 相对索引在变量的堆栈上创建 space。