1.vi main.c编写一个c代码文件
include <stdio.h>
void swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
int main()
{
int a,b;
a=1;
b=2;
swap(&a,&b);
}
2.编译
shellby@ubuntu:~/devlop$ gcc -o main main.c
3.反汇编
shellby@ubuntu:~/devlop$ objdump -D main
4.分析汇编
080483b4 <swap>:
80483b4: 55 push %ebp //ebp入栈
80483b5: 89 e5 mov %esp,%ebp //esp值传给ebp
80483b7: 83 ec 10 sub $0x10,%esp //局部变量tmp 实际只需要4字节 分配了16字节 和优化有关 16字节对齐
80483ba: 8b 45 08 mov 0x8(%ebp),%eax //取a的地址
80483bd: 8b 00 mov (%eax),%eax //取a的值给eax
80483bf: 89 45 fc mov %eax,-0x4(%ebp) //a的值给tmp
80483c2: 8b 45 0c mov 0xc(%ebp),%eax //取b的地址
80483c5: 8b 10 mov (%eax),%edx //
80483c7: 8b 45 08 mov 0x8(%ebp),%eax
80483ca: 89 10 mov %edx,(%eax)
80483cc: 8b 45 0c mov 0xc(%ebp),%eax
80483cf: 8b 55 fc mov -0x4(%ebp),%edx
80483d2: 89 10 mov %edx,(%eax)
80483d4: c9 leave //等同于 mov %ebp, %esp pop %ebp
80483d5: c3 ret
和swap类似:
080483d6 <main>:
80483d6: 55 push %ebp
80483d7: 89 e5 mov %esp,%ebp
80483d9: 83 ec 18 sub $0x18,%esp
80483dc: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%ebp)
80483e3: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%ebp)
80483ea: 8d 45 fc lea -0x4(%ebp),%eax
80483ed: 89 44 24 04 mov %eax,0x4(%esp)
80483f1: 8d 45 f8 lea -0x8(%ebp),%eax
80483f4: 89 04 24 mov %eax,(%esp)
80483f7: e8 b8 ff ff ff call 80483b4 <swap>
80483fc: c9 leave
80483fd: c3 ret
80483fe: 90 nop
80483ff: 90 nop
本文详细介绍了如何使用C语言编写代码,并通过GCC编译器进行编译,然后使用objdump工具进行反汇编,最后对生成的汇编代码进行深入分析。包括swap函数的实现、内存操作、参数传递及函数调用过程。
759

被折叠的 条评论
为什么被折叠?



