为什么在堆栈和堆上创建变量会产生相同的汇编代码?

geo*_*o10 1 c++ x86 assembly disassembly

我创建了一个示例代码,因为我试图让自己进入汇编。我在堆栈上声明并初始化一个整数,并对堆上的一个整数也做同样的事情。在查看汇编代码时,它们都会产生非常相似的代码:

mov dword ptr [ebp-8],0     ; this is on the stack
mov dword ptr [ebp-14h],0   ; this is on the stack

mov eax,dword ptr [ebp-20h] ; this is on the heap
mov dword ptr [eax],0       ; this is on the heap
Run Code Online (Sandbox Code Playgroud)

你能解释一下我忽略了什么吗?

拆解的相关部分可以在下面找到:

    int x = 0;
00111848  mov         dword ptr [ebp-8],0  
    int y = 0;
0011184F  mov         dword ptr [ebp-14h],0  
    int* z = new int;
00111856  push        4  
00111858  call        00111325  
0011185D  add         esp,4  
00111860  mov         dword ptr [ebp+FFFFFF14h],eax  
00111866  mov         eax,dword ptr [ebp+FFFFFF14h]  
0011186C  mov         dword ptr [ebp-20h],eax  
    *z = 0;
0011186F  mov         eax,dword ptr [ebp-20h]  
00111872  mov         dword ptr [eax],0  
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 7

两个都

int y = ....;
Run Code Online (Sandbox Code Playgroud)

int* z = ....;
Run Code Online (Sandbox Code Playgroud)

创建一个自动变量(即堆栈)。一个是整数,另一个是指针。

第一个用 0 初始化,另一个用new int. 这将创建动态对象,并导致对内存分配函数的调用call 00111325