Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在汇编中创建动态变量?(x86汇编)_Variables_Assembly_Dynamic_X86_Procedure - Fatal编程技术网

Variables 在汇编中创建动态变量?(x86汇编)

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

假设我的汇编代码中有一个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 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”=>随你怎么说都不重要。我想你至少应该提到高级语言变量的概念也可以映射到寄存器,因为一开始避免溢出到堆栈中要好得多。我认为您至少应该提到高级语言变量的概念也可以映射到寄存器,因为一开始避免溢出到堆栈中要好得多。非常感谢大家。我真的很感谢你们帮助我,这样我才能更好地理解这一点!非常感谢大家。我真的很感谢你们帮助我,这样我才能更好地理解这一点!