请教64位汇编的问题

leetow2006 2018-07-31 12:16:19
我的C语言是这样的:
int main()
{
long buf[1];
}
然后我gcc -S buf1.c,看到的汇编代码:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6,-16
movq %rsp,%rbp
.cfi_def_cfa_register 6

我记得32位都是类似这样的(asm汇编):
push ebp
mov ebp,esp
sub esp,XXX ;这样的XXX是局部变量占用的大小
可是64位的,pushq %rbp是不是相当于push ebp,
但这里的pushq %rbp是不是压栈64位的(8个字节)?
另外:我在C中申请的局部变量,也没有看到类似
sub esp,XXX这样的代码,难道64位汇编有不同吗?
另:请问类似于.cfi_这样的是表示什么意思?
...全文
483 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_21896307 2018-08-11
  • 打赏
  • 举报
回复
#include <stdio.h> #include <stdlib.h> void func1() { printf("Hello, world.\n"); exit(0); } void func2(void *p[]) { p[3] = func1; } int main() { void *p[1]; func2(p); return 0; }
  • 打赏
  • 举报
回复
禁用优化应该是-O0,但是移除未使用的数据可能还是有效,需要-f开头的某些优化选项,具体我也记不住。
如果用gcc的话,上面的p[3] = func1;要改成p[3] = (void *)func1;
leetow2006 2018-08-01
  • 打赏
  • 举报
回复
应该是数据没用到,被优化掉了
============
我编译时没有加优化选项,也会被优化掉吗?
能否有不让优化的参数选项?我用的是gcc(我
在64位的linux中使用的)。
  • 打赏
  • 举报
回复
引用 2 楼 leetow2006 的回复:
请看:
int why_here()
{
printf("hello\n");
exit(0);
}
int main()
{
long buf[1];
buf[2]=(long)why_here;
}
按道理buf[2]存放的就是函数why_here的地址,那么main函数应该能进入why_here函数,可是为什么没有反应呢?


应该是数据没用到,被优化掉了,这样就可以了:
#include <stdio.h>
#include <stdlib.h>

void func1()
{
printf("Hello, world.\n");
exit(0);
}

void func2(void *p[])
{
p[3] = func1;
}

int main()
{
void *p[1];
func2(p);

return 0;
}
zara 2018-08-01
  • 打赏
  • 举报
回复
调试下嘛,看看填到哪里了,跟执行流程有什么关系与预想的有何不同
leetow2006 2018-07-31
  • 打赏
  • 举报
回复
请看:
int why_here()
{
printf("hello\n");
exit(0);
}
int main()
{
long buf[1];
buf[2]=(long)why_here;
}
按道理buf[2]存放的就是函数why_here的地址,那么main函数应该能进入why_here函数,可是为什么没有反应呢?
  • 打赏
  • 举报
回复
类似于.cfi_这样的是表示什么意思?
参考:https://sourceware.org/binutils/docs/as/CFI-directives.html#CFI-directives
.cfi_def_cfa_offset这些只是助记用的调试信息,.cfi_def_cfa_offset 16是说当前栈指针距离CFA 16字节,CFA,Canonical Frame Address,是指前一个栈框架中的栈指针,比如你的例子,就是调用main()之前的栈指针,然后调用压入8 字节返回地址,pushq %rbp又压入8字节,距离CFA就16字节了。
实际都是些很无聊的概念。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧