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

标签 c++ assembly x86 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

您能否说明一下我所忽略的内容?

拆卸的相关部分位于以下位置:
    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  

最佳答案


int y = ....;


int* z = ....;

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

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

关于c++ - 为什么在堆栈和堆上创建变量会产生相同的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59868192/

相关文章:

c++ - OpenGL 只能绑定(bind)到 GL_TEXTURE0

c++ - 什么消息导致按钮发送 WM_COMMAND 消息

linux - 使用数组组装 x86 中的汉诺塔

GDB 命令打印段错误的完整异常信息?

assembly - 如何在汇编中打印字符串的长度

c++ - C++ 中的 'and' 和 '&' 有什么区别?

c++ - 使用 FFmpeg 进行 MPEG 反向帧解码

assembly - 涡轮风扇发动机为什么会剥落小环?

c - 汇编程序和 C 编程 linux -m32(来自汇编程序寄存器的字符字节)

assembly - Linux内核0.01引导加载程序使用rep movw,而不是rep movsw?这实际上是重复普通的 MOV 吗?