c - 在已编译的 C 程序中查找 asm 指令

标签 c linux assembly x86

我有一个非常简单的 C 程序:

int foobar(int a)
{
    int b = a;
}

int main(int argc, char *argv[])
{
    foobar(0xDEAD);
    return 0;
}

使用 objdump -d main.out 我得到了带有大量汇编指令的反汇编二进制文件:

  4004a3:   55                      push   %ebp
  4004a4:   48 89 e5                mov    %esp,%ebp
  4004a7:   48 83 ec 10             sub    $0x10,%esp

我如何从另一个 C 程序中找到每个 push 指令的地址? 可以这样做吗?:

position = 0;
while (...)
{
   ...
   int act_value;
   read(binary_file, &act_value, 4);

   if (act_value == /*what value?*/)
   {
      printf("Instruction: push\n");
      printf("Address: %X\n", position * 4); /* is this correct?*/
   }
   position++;
   ...
}

最佳答案

正如 Oli Charlesworth 已经指出的那样,x86 架构上的指令长度可变。您仍然可以编写一个程序来为您执行此操作,但您需要解析所有指令以正确了解它们有多长以及下一条指令从哪里开始。

我不明白您为什么要编写自己的程序来解决问题,或者您有什么事情没有告诉我们?您是否只是在寻找一种方法来查找 push 指令的地址?如果是这样,就这样做:

objdump -d another_c_program | grep push

当然这个也会找pushl之类的。我猜你也想要它们,否则可以修改命令。

关于c - 在已编译的 C 程序中查找 asm 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649473/

相关文章:

c - IEEE 802.2 逻辑链路控制层(以太网)是全双工的吗?

c++ - 为什么免费调用两次时会崩溃?

在实模式下用 Bresenham 的线算法计数,汇编

汇编 - .data、.code 和寄存器...?

performance - 为什么引入无用的 MOV 指令会加速 x86_64 汇编中的紧密循环?

c++ - 将结构的一部分分配给c中的另一个结构

c - 从 C 中的字符串数组打印 'triangle' 个字符

linux - sudo: (whatever): 在 RHEL 5.8 上找不到命令

PHP 可以在网络上运行,但不能在本地 apache 上运行(linux mint)

linux - 添加到 Apache 上可用的站点