cfi对我来说不清楚 更新:
我可以在那里找到部分答案: 第58页。 Pffeeew汇编是一种很难的语言:) 背景: 现在学习气体组装2-3天。 Linux 64位 通用条款4.8.2 编译时不进行优化(-O0-march=native),以查看生成的基本程序集 问题: 我下面的解释正确吗? 我所有的C转换代码都是用相同的方法编写的cfi对我来说不清楚 更新:,c,gcc,assembly,x86-64,C,Gcc,Assembly,X86 64,我可以在那里找到部分答案: 第58页。 Pffeeew汇编是一种很难的语言:) 背景: 现在学习气体组装2-3天。 Linux 64位 通用条款4.8.2 编译时不进行优化(-O0-march=native),以查看生成的基本程序集 问题: 我下面的解释正确吗? 我所有的C转换代码都是用相同的方法编写的 .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_de
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
#my code here
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
我试图解释以下步骤:
(一)
我读到,cfi_def_cfa_偏移量
必须是64位的16。这是一条规则(对吗?)
(二)
cfi_偏移量
和cfi_def_cfa_寄存器
与值6“关联”为什么??
(三)
我知道我们用subq
跳过cfi_def_cfa_偏移量16字节
(四)
但是为什么cfi_def_cfa 7,8
最终会出现呢?我觉得没有意义,因为8在哪里都没有出现。顺便问一下,为什么不cfi_def_cfa 15,16
谢谢我相信
6
是rbp
的注册号,7
是rsp
。如果您自己编写程序集,可以使用寄存器名,例如%rbp
,而不是6
。干得好,JS1,多亏了您的指点,我可以得到我的答案。我将相应地更新问题+1.顺便说一句,如果你能给出一个答案,那就多找一些代表:)一般来说,在编写汇编程序时,你不必费心于cfi
指令,除非你想要非常好的调试。谢谢Jester,这是我要知道的一点;)