繁体   English   中英

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

[英]Dynamic Variable creation in assembly? (x86 Assembly)

可以这样说,我的汇编代码中有一个PROC:

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

我想将MOV 1移到EAX寄存器中,然后将13移到EBX寄存器中,但是我想在PROC本地创建两个变量,将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在Godbolt编译器浏览器上 )编译为以下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相对索引在堆栈上为变量创建空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM