装配中的动态变量创建? (x86组装)

时间:2016-12-08 04:03:17

标签: variables assembly dynamic x86 procedure

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

变量是一个高级概念。一段时间内,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-asmon 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

答案 1 :(得分:1)

好像你正在使用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相对索引为变量在堆栈上创建空间。