如何抵消堆叠?

源代码:

1       int func()
2       {
3           int a = 0x12345678;
4           int *p = &a;
5           return *p;
6       }

8       int main()
9       {
10          int b = 0x87654321;
11          return b + func();
12      }

拆卸:

(gdb) disass main
Dump of assembler code for function main():
0x0000000000400544 

我的问题是后续行中的0xc如何

"0x000000000040052c 

我的理解是:0x12345678对于变量a占用4个字节,对于指针p占用4个字节,其余4个字节用于什么?

谢谢.

编辑:

Linux 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64

编辑1 ::
还有一个问题:
以下是什么?

函数main()的汇编代码转储:

0x0000000000400544 

编辑2:
为什么main()需要与16个字节对齐(“sub $0x10,%rsp”)而func不是(0x0c没有对齐,对吧?)?

最佳答案

Linux 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64

… followed by 4 bytes for pointer “p”

您使用的是64位架构,因此指针占用64位= 8个字节:

#include 
$gcc -std=c99 -Wall -pedantic -o sample sample.c
$./sample
8
4

详细的堆栈分析:

当输入func()时,在执行前两条指令后,堆栈看起来像这样(假设每个矩形是4字节的内存):

0x0000000000400528 

然后,您将值存储到本地变量中:

0x000000000040052c 

然后,您将64位指针存储到p变量中:

0x0000000000400533 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


查找全部容器的日志文件 $ sudo find /var/lib/docker/containers -name *.log 查看日志位置 $ docker inspect --format='{{.LogPath}}' <container_name> 实时查询内容 $
Linux日志文件中列属性的详细解析
在Linux系统中没有duf命令,如何有效地管理磁盘空间?
深入探讨EncryptPad在Linux操作系统中的功能和优势
原理和应用场景:Linux中ttyload工具的工作原理和实际用途
深度解析SELinux的三种策略类型
评估Linux系统性能的ttyload工具使用效果
分享在Linux系统中检测SSH版本的方法
介绍Linux平台上的数据加密工具EncryptPad
在Linux系统中,如何查看和诊断块设备信息?
在Linux环境下如何查看块设备信息?
探索Linux操作系统下的数据加密工具EncryptPad
学会在Linux系统中查看硬盘信息
分析SELinux:原理与实践
掌握SELinux策略类别
技巧:有效解读和管理Linux日志文件
查看Linux系统中的所有用户
了解Linux系统中各种不同类型的日志文件
深入理解Linux PS命令
方法:在Linux操作系统中查看用户