【发布时间】:2011-06-22 17:12:33
【问题描述】:
谁能告诉我 x86 ASM 中的以下代码是做什么的?它只是一个较大文件的一部分,但正是这一点让我感到沮丧。
find_max:
6 .LFB0:
7 .cfi_startproc
8 pushq %rbp
9 .cfi_def_cfa_offset 16
10 movq %rsp, %rbp
11 .cfi_offset 6, -16
12 .cfi_def_cfa_register 6
13 movl %edi, -20(%rbp)
14 movl -20(%rbp), %eax
15 cltq
16 movl a(,%rax,4), %eax
17 movl %eax, -4(%rbp)
18 movl -20(%rbp), %eax
19 movl %eax, -8(%rbp)
具体来说,
- 第 13 行的 %edi 最初是什么?
- 为什么代码引用 -20(%rbp)?
- 那么第 16 行究竟做了什么?
- 切换 32 位寄存器和 64 位寄存器背后的智慧是什么(例如第 15 行的情况)?
我反汇编得到的 C 代码如下所示:
extern int a[];
int find_max(int n)
{
int max = a[n];
int pos = n;
int x;
while (n > 0)
{
n--;
x = a[n];
if (x > max)
{
max = x;
pos = n;
}
}
return pos;
}
【问题讨论】:
-
如果你有 C 代码,你不知道它在做什么吗?你到底想问什么?
标签: assembly x86 disassembly