Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 实现.cfi_记住_状态_Gcc_Assembly_X86_X86 64_Gnu Assembler - Fatal编程技术网

Gcc 实现.cfi_记住_状态

Gcc 实现.cfi_记住_状态,gcc,assembly,x86,x86-64,gnu-assembler,Gcc,Assembly,X86,X86 64,Gnu Assembler,我想知道.cfi\u memory\u state是如何实现的。我知道这是一个伪操作,所以我想它在组装时会转换成几个指令。我感兴趣的是使用什么确切的指令来实现它。我尝试了很多方法来解决这个问题。即: 阅读气体源代码。但没能找到足够有用的东西 阅读气体文档。但是.cfi\u memory\u state条目只是一个简单的笑话(字面意思) 试图找到一个gcc开关,使gcc通过伪操作“扩展”从C代码生成asm。找不到x86/x86-64的此类交换机。(顺便说一句,如果有人能给我指出这样一个开关,那就

我想知道
.cfi\u memory\u state
是如何实现的。我知道这是一个伪操作,所以我想它在组装时会转换成几个指令。我感兴趣的是使用什么确切的指令来实现它。我尝试了很多方法来解决这个问题。即:

  • 阅读气体源代码。但没能找到足够有用的东西
  • 阅读气体文档。但是
    .cfi\u memory\u state
    条目只是一个简单的笑话(字面意思)
  • 试图找到一个gcc开关,使gcc通过伪操作“扩展”从C代码生成asm。找不到x86/x86-64的此类交换机。(顺便说一句,如果有人能给我指出这样一个开关,那就太好了。)
  • googlefu&搜索结果并没有产生任何有用的结果
在我看来,唯一的另一种解决方案是读取汇编的可执行文件的二进制文件,并尝试推断指令。然而,我希望避免这样一项艰巨的任务。
谁知道,你们中有谁能告诉我,它是如何在x86和/或x86-64上实现的?可能还需要分享获取信息的方式/地点,以便我可以检查其他伪操作,如果我有必要的话?

此指令是DWARF信息的一部分(实际上它所做的只是发出DW\u CFA\u MEMORE\u state指令)。摘自DWARF3标准:

DW_CFA_memory_state指令不接受任何操作数。必要的 操作是将每个寄存器的规则集推送到隐式 堆叠

您可以使用objdump处理矮人信息。让我们从简单的void汇编程序文件开始:

  .text
.globl main
  .type main, @function
main:
.LFB0:
.cfi_startproc
#.cfi_remember_state
.cfi_endproc
.LFE0:
  .size main, .-main
用gcc cfirem.s-c-o cfirem.o编译它

现在用
objdump--DWARF cfirem.o分解生成的DWARF部分
您将获得:

00000018 00000014 0000001c FDE cie=00000000 pc=00000000..00000000
  DW_CFA_nop
  DW_CFA_nop
  ...
如果要取消注释.cfi_memory_state,您将看到:

00000018 00000014 0000001c FDE cie=00000000 pc=00000000..00000000
  DW_CFA_remember_state
  DW_CFA_nop
  DW_CFA_nop
  ...

因此,它实际上并不是在汇编指令中转换(请尝试
objdump-d
,看看我们的示例中根本没有汇编指令)。它被转换成DWARF伪指令,在GDB之类的调试器处理变量位置、堆栈信息等时使用。

可能重复@AlexeyFrunze是的,我知道另一个问题。但我的问题不同。我不是问它们是什么,而是问它们是如何实现的!根据您刚才的回答做了一个类似的测试,我可以看到它确实生成了4条更多的指令,使用
.cfi\u memory\u state
。谢谢!我想您使用了-D,而这些“四条指令”实际上是.eh_frame部分中DW_CFA_memory_状态的字节对字节表示。它不是真正的汇编程序。使用-d只获得真正的汇编程序。哦!现在我明白了!我假设默认情况下GCC不会生成调试信息,但我注意到它在从C创建asm时仍然会生成这些信息。所以我认为它不仅用于调试,还用于其他目的。现在我查看了使用-g0生成的asm,它们不再存在。而gcc之前一直默认为-g2。我真傻!