【问题标题】:What do assembly registers refer to in C code? [closed]汇编寄存器在 C 代码中指的是什么? [关闭]
【发布时间】:2016-09-25 23:16:47
【问题描述】:

我目前正在重构c代码,里面有汇编代码:

asm("movl $8, %esi\n\t"
    movl $.LC0, %edi\n\t"
    "movl $0, %eax");

每个寄存器的含义是什么?在 c 代码中,没有其他 asm 代码分配 $8 或 $.LC0,我假设 $0 只是一个零值

【问题讨论】:

  • 这意味着这个 C 代码针对一个特定的 CPU,每个寄存器都意味着:那个特定的 CPU 寄存器。
  • @SamVarshavchik 无论如何都知道这些寄存器值到底是什么,不确定代码是否正在移动这些值
  • 它将某些值加载到寄存器中,除此之外没有其他直接影响。这也是由不知道自己在做什么的人编写的严重损坏的代码。
  • 如果你看到这个 C 代码:“esi = 8; edi = &_LC0; eax = 0;` 那么有什么方法可以知道这些变量值到底是什么?

标签: c assembly


【解决方案1】:

在汇编级别,.LC0 是一个标签,您只能在编译器输出中找到它,而不是在手写汇编中。

.LC 开头的标签由 gcc 生成,用于标记字符串文字的位置。 movl $.LC0, %edi 最可能的含义是%edi 将指向编译器在源文件中遇到的第一个字符串文字。但这显然不是一件干净的事情。

如果您尝试对某些恶意代码进行逆向工程,您可能必须展示整个内容才能使其有意义。 C 和程序集之间的全局交互指向一些混淆的尝试。

如果您不是想对某些恶意代码进行逆向工程...现在开始考虑此代码是恶意的。

【讨论】:

    【解决方案2】:

    它们什么都没有;这个内联 asm 片段是垃圾,并且只有在使用正确版本的正确编译器和正确的优化选项编译正确的周围代码时才会做任何有用的事情,以便编译器生成的围绕它的代码以该片段的方式工作预计。

    请参阅 标记 wiki 获取教程和文档的链接,这些链接和文档解释了如何编写不糟糕的 GNU C 内联 asm 代码。

    这段代码不仅在技术上是“不安全的”,它确实会因为对周围代码或优化选项的最轻微改变而崩溃,因为它不会告诉编译器它认为它修改了哪些 C 值。

    代码片段中唯一具有任何已知含义的是立即数常量 0 和 8。在 AT&T 语法中,立即数以 $ 为前缀。 (mov .LC0, %edi(不带 $)将是从该地址加载,而不是将地址放入寄存器。但是您不知道编译器决定用 .LC0 标记哪个常量,或者编译器要做什么与%edi 相关,所以这是无用的)请参阅 标签wiki 以获取x86 文档和汇编器手册的链接。

    请参阅 the Godbolt compiler explorer 上 C 语言中 Hello World 的 asm,以获取编译器生成代码的示例。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2016-12-22
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多