假设我的汇编代码中有一个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
但这仍然不是动态变量创建,我只是在寄存器之间来回写入和读取数据。所以本质上我试图弄清楚如何在运行时在程序集中创建变量。我将不胜感激任何帮助。
答案 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-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
答案 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
相对索引为变量在堆栈上创建空间。