如何确定程序集正在调用的地址

时间:2016-11-04 12:41:16

标签: c assembly x86 att

我正在尝试破译简单的汇编代码,但我对该语言的熟练程度不高。如果我在main中有以下代码块:

 push   %ebp
 8048a45:       89 e5                   mov    %esp,%ebp
 8048a47:       53                      push   %ebx
 8048a48:       83 e4 f0                and    $0xfffffff0,%esp
 8048a4b:       83 ec 10                sub    $0x10,%esp
 8048a4e:       8b 45 08                mov    0x8(%ebp),%eax
 8048a51:       8b 5d 0c                mov    0xc(%ebp),%ebx
 8048a54:       83 f8 01                cmp    $0x1,%eax
 8048a57:       75 0c                   jne    8048a65 <main+0x21>
 8048a59:       a1 c4 d7 04 08          mov    0x804d7c4,%eax ??
 8048a5e:       a3 f0 d7 04 08          mov    %eax,0x804d7f0 ??
 8048a63:       eb 74                   jmp    8048ad9 <main+0x95>
 8048a65:       83 f8 02                cmp    $0x2,%eax
 8048a68:       75 49                   jne    8048ab3 <main+0x6f>
 8048a6a:       c7 44 24 04 e8 a2 04    movl   $0x804a2e8,0x4(%esp)

在第8048a59行和第048a5e行,我已经把问号放在了,我假设它试图将地址0x804d7f0中的任何内容设置为地址0x804d7c4中的内容,但我怎么知道这些地址具体是什么?

1 个答案:

答案 0 :(得分:1)

首先,您需要确定哪个部分对应此地址。您可以使用objdump执行此操作,例如objdump -h

然后你可以像你完成here一样反汇编您感兴趣的部分。

Here有关查看部分及其地址的一些有用信息。

其他方法是使用运行时调试器并打印输出内存,例如gdb x addr

P.S。如果你想恢复变量名,可能是不可能的,因为编译器通常会删除大多数符号的那种信息。