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)
两个都
int y = ....;
Run Code Online (Sandbox Code Playgroud)
和
int* z = ....;
Run Code Online (Sandbox Code Playgroud)
创建一个自动变量(即堆栈)。一个是整数,另一个是指针。
第一个用 0 初始化,另一个用new int. 这将创建动态对象,并导致对内存分配函数的调用call 00111325。