Variables 在汇编中创建动态变量?(x86汇编)
假设我的汇编代码中有一个PROC,如下所示:Variables 在汇编中创建动态变量?(x86汇编),variables,assembly,dynamic,x86,procedure,Variables,Assembly,Dynamic,X86,Procedure,假设我的汇编代码中有一个PROC,如下所示: .CODE PROC myProc MOV EAX, 00000001 MOV EBX, 00001101 RET ENDP myProc 在我的过程中,我想将1移动到EAX寄存器中,并将13移动到EBX寄存器中,但是我想在我的过程中创建两个局部变量,将var a的值指定为1,将var b的值指定为13,然后将[a]移动到EAX,将[b]移动到EBX。我以前对此有过很多想法,可能是在堆栈上为变量创建空间,或者类似于: .CODE PROC myPr
.CODE
PROC myProc
MOV EAX, 00000001
MOV EBX, 00001101
RET
ENDP myProc
在我的过程中,我想将1移动到EAX寄存器中,并将13移动到EBX寄存器中,但是我想在我的过程中创建两个局部变量,将var a的值指定为1,将var b的值指定为13,然后将[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
但这仍然不是动态变量创建,我只是在寄存器之间来回写入和读取数据。所以本质上,我试图弄清楚如何在运行时在程序集中创建变量。非常感谢您的帮助。变量是一个高级概念。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
()编译为以下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
变量是一个高级概念。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
()编译为以下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
相对索引在堆栈上为变量创建空间。看起来您使用的是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
相对索引在堆栈上为变量创建空间。您的第二个示例毫无意义。如果为堆栈指针指定一个常量,则会丢失对按下ESP和EBP的位置的唯一引用。而且,moveax,[001]
只是在一个错误的地址上出错。在你的第二个例子中,我也没有看到任何寄存器到寄存器的移动,所以我知道它的作用,但它不是“在寄存器之间来回写入和读取数据”。如果你想要动态内存空间来存储一些值,对于小尺寸的东西(最多几kiB),你通常可以在堆栈上保留该空间,这就是C所做的。在程序开始时,序言指令之一可能是子esp,
,在ret
之前,您恢复esp(释放该空间)。在这两者之间,您可以通过[esp+]
对其进行处理,尽管通常使用ebp
。如果您想要巨大的(kiB->MiB/GiB)动态内存空间,请检查API以获得堆分配。“Variables”=>随你怎么说都行,不重要。你的第二个例子是胡说八道。如果为堆栈指针指定一个常量,则会丢失对按下ESP和EBP的位置的唯一引用。而且,moveax,[001]
只是在一个错误的地址上出错。在你的第二个例子中,我也没有看到任何寄存器到寄存器的移动,所以我知道它的作用,但它不是“在寄存器之间来回写入和读取数据”。如果你想要动态内存空间来存储一些值,对于小尺寸的东西(最多几kiB),你通常可以在堆栈上保留该空间,这就是C所做的。在程序开始时,序言指令之一可能是子esp,
,在ret
之前,您恢复esp(释放该空间)。在这两者之间,您可以通过[esp+]
对其进行处理,尽管通常使用ebp
。如果您想要巨大的(kiB->MiB/GiB)动态内存空间,请检查API以获得堆分配。“Variables”=>随你怎么说都不重要。我想你至少应该提到高级语言变量的概念也可以映射到寄存器,因为一开始避免溢出到堆栈中要好得多。我认为您至少应该提到高级语言变量的概念也可以映射到寄存器,因为一开始避免溢出到堆栈中要好得多。非常感谢大家。我真的很感谢你们帮助我,这样我才能更好地理解这一点!非常感谢大家。我真的很感谢你们帮助我,这样我才能更好地理解这一点!