[英]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.