assembly - 我需要帮助理解某些说明的含义
问题描述
我正在学习 x86 汇编,但在理解某些指令时遇到了一些问题。什么sub $0x10,%rsp
意思,为什么 GCC 复制了这mov $0x0,%eax
行两次?
0x0000000000001135 <+0>: push %rbp
0x0000000000001136 <+1>: mov %rsp,%rbp
0x0000000000001139 <+4>: sub $0x10,%rsp
0x000000000000113d <+8>: movl $0xa,-0x4(%rbp)
0x0000000000001144 <+15>: mov -0x4(%rbp),%eax
0x0000000000001147 <+18>: mov %eax,%esi
0x0000000000001149 <+20>: lea 0xeb4(%rip),%rdi # 0x2004
0x0000000000001150 <+27>: mov $0x0,%eax
0x0000000000001155 <+32>: callq 0x1030 <printf@plt>
0x000000000000115a <+37>: mov $0x0,%eax
0x000000000000115f <+42>: leaveq
0x0000000000001160 <+43>: retq
解决方案
sub $0x10,%rsp
在堆栈上分配空间,这与执行pushq 0
两次相同,只是分配的堆栈空间中的值不一定为零,但这没关系,因为mov
稍后使用的指令将垃圾替换为真实数据。
正如迈克尔正确指出的那样,这mov $0x0,%eax
是因为printf
(以及任何其他可变参数函数)采用rax
.
推荐阅读
- rust - 在其他文件中调用 Struct 数据类型
- android - 什么是 CursorLoader 的 Android Jetpack 替代品?
- angular - 如果任何表单控件值无效,如何突出显示 Primeng 选项卡 - Angular
- r - R 也无法连接以打开文件
- excel - 不要在 apache poi 中使用 XSSFBReader 读取隐藏的 xlsb 文件表
- javascript - 过滤后动态添加到表的行不隐藏
- angular8 - 目标入口点“angular-in-memory-web-api”中的错误缺少依赖项:-@angular/http
- recursion - DFS 获得所有可能的解决方案?
- python - 根据python中的自定义函数聚合数据框中的每一列
- css - css 变换原点属性和倾斜函数