题目是这样的:
有一个函数原型为
void decode1(int *xp,int *yp,int * zp);
函数的编译成汇编代码后如下:
1 movl 8(%ebp),%edi
2 movl 12(%ebp),%ebx
3 movl 16(%ebp),%esi
4 movl (%edi),%eax
5 movl (%ebx),%edx
6 movl (%esi),%ecx
7 movl %eax,(%ebx)
8 movl %edx,(%esi)
9 movl %ecx,(%edi)
要求写出等效的C代码。
分析过程:(中间伪代码)
edi = xp
ebx = yp
esi = zp
eax = *xp
edx = *yp
ecx = *zp
最后函数内的代码推测为:
*yp = *xp
*zp = *yp
*xp = *zp
用反汇编工具验证:
首先编写代码decode.c:
void decode(int *xp,int *yp,int *zp)
{
*yp = *xp;
*zp = *yp;
*xp = *zp;
}
gcc编译:gcc -O2 -c decode.c
反汇编:objdump -d decode.o
反汇编代码如下:
00000000 <_decode>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 4d 08 mov 0x8(%ebp),%ecx
6: 8b 11 mov (%ecx),%edx
8: 8b 45 0c mov 0xc(%ebp),%eax
b: 89 10 mov %edx,(%eax)
d: 8b 45 10 mov 0x10(%ebp),%eax
10: 89 10 mov %edx,(%eax)
12: 89 11 mov %edx,(%ecx)
14: 5d pop %ebp
15: c3 ret
16: 90 nop
17: 90 nop
翻译机器的反汇编代码为:
*yp = *xp
*zp = *xp
*xp = *xp
原本的函数代码:
*yp = *xp
*zp = *yp
*xp = *zp
貌似有点差距,但仔细一看,其实是一模一样的,看来计算机还是能看透事物的本质啊!!(其实这段函数功能就是三个值都等于*xp啊)