您的位置 首页 测评

C言语函数调用剖析

我的测试环境:Fedora14Gcc版本:gcc-451内核版本:26381C语言是一个强大的语言,特别是对于嵌入式开发过程中有时需要反汇编分析代码

我的测验环境:Fedora14

Gcc版别:gcc-4.5.1
内核版别:2.6.38.1
C言语是一个强壮的言语,特别是关于嵌入式开发过程中有时需求反汇编剖析代码中存在的问题,函数是C言语中的难点,关于函数的调用也是许多人不能了解的,许多知道的也是一知半解。对C言语的调用有了一个比较明晰的知道就能够更明晰的剖析代码中存在的问题。我也是看了许多的材料,然后自己写了一一段小代码作为剖析的测验代码。首要记住在X86系统里许多的寄存器都有特别的用处,其间ESP表明当时函数仓库的栈顶指针,而EBP则表明当时函数仓库的基地址。EBP是栈基址的指针,永久指向栈底(高地址),ESP是栈指针,永久指向栈顶(低地址)。
我的代码如下:
  1. #include
  2. intpluss_a_and_b(inta,intb)
  3. {
  4. intc=-2;
  5. return(a+b-c);
  6. }
  7. intcall_plus(int*a,int*b)
  8. {
  9. intc=*a;
  10. intd=*b;
  11. *a=d;
  12. *b=c;
  13. return pluss_a_and_b(c,d);
  14. }
  15. intmain()
  16. {
  17. intc=10;
  18. intd=20;
  19. intg=call_plus(&c,&d);
  20. return 0;
  21. }
对上面的代码进行编译和反汇编:
[gong@Gong-Computer deeplearn]$ gcc -g testcall.c -o testcall
[gong@Gong-Computer deeplearn]$ objdump -S -d testcall > testcall_s
然后对反汇编的代码进行剖析:
  1. 8048393: c3 ret
  2. 08048394 :
  3. #include
  4. int pluss_a_and_b(int a,int b)
  5. {
  6. 8048394: 55 push %ebp
  7. 8048395: 89 e5 mov %esp,%ebp
  8. 8048397: 83 ec 10 sub $0x10,%esp
  9. int c = -2;
  10. 804839a: c7 45 fc fe ff ff ff movl $0xfffffffe,-0x4(%ebp)
  11. return (a + b – c);
  12. 80483a1: 8b 45 0c mov 0xc(%ebp),%eax
  13. 80483a4: 8b 55 08 mov 0x8(%ebp),%edx
  14. 80483a7: 8d 04 02 lea (%edx,%eax,1),%eax
  15. 80483aa: 2b 45 fc sub -0x4(%ebp),%eax
  16. }
  17. 80483ad: c9 leave
  18. 80483ae: c3 ret
  19. 080483af :
  20. intcall_plus(int *a,int *b)
  21. {
  22. 80483af: 55 push %ebp
  23. 80483b0: 89 e5 mov %esp,%ebp
  24. 80483b2: 83 ec 18 sub $0x18,%esp
  25. int c = *a;
  26. 80483b5: 8b 45 08 mov 0x8(%ebp),%eax
  27. 80483b8: 8b 00 mov (%eax),%eax
  28. 80483ba: 89 45 fc mov %eax,-0x4(%ebp)
  29. int d = *b;
  30. 80483bd: 8b 45 0c mov 0xc(%ebp),%eax
  31. 80483c0: 8b 00 mov (%eax),%eax
  32. 80483c2: 89 45 f8 mov %eax,-0x8(%ebp)
  33. *a = d;
  34. 80483c5: 8b 45 08 mov 0x8(%ebp),%eax
  35. 80483c8: 8b 55 f8 mov -0x8(%ebp),%edx
  36. 80483cb: 89 10 mov %edx,(%eax)
  37. *b = c;
  38. 80483cd: 8b 45 0c mov 0xc(%ebp),%eax
  39. 80483d0: 8b 55 fc mov -0x4(%ebp),%edx
  40. 80483d3: 89 10 mov %edx,(%eax)
  41. return pluss_a_and_b(c,d);
  42. 80483d5: 8b 45 f8 mov -0x8(%ebp),%eax
  43. 80483d8: 89 44 24 04 mov %eax,0x4(%esp)
  44. 80483dc: 8b 45 fc mov -0x4(%ebp),%eax
  45. 80483df: 89 04 24 mov %eax,(%esp)
  46. 80483e2: e8 ad ff ff ff call 8048394
  47. }
  48. 80483e7: c9 leave
  49. 80483e8: c3 ret
  50. 080483e9
    :
  51. int main()
  52. {
  53. 80483e9: 55 push %ebp
  54. 80483ea: 89 e5 mov %esp,%ebp
  55. 80483ec: 83 ec 18 sub $0x18,%esp
  56. int c = 10;
  57. 80483ef: c7 45 f8 0a 00 00 00 movl $0xa,-0x8(%ebp)
  58. int d = 20;
  59. 80483f6: c7 45 f4 14 00 00 00 movl $0x14,-0xc(%ebp)
  60. int g =call_plus(&c,&d);
  61. 80483fd: 8d 45 f4 lea -0xc(%ebp),%eax
  62. 8048400: 89 44 24 04 mov %eax,0x4(%esp)
  63. 8048404: 8d 45 f8 lea -0x8(%ebp),%eax
  64. 8048407: 89 04 24 mov %eax,(%esp)
  65. 804840a: e8 a0 ff ff ff call 80483af
  66. 804840f: 89 45 fc mov %eax,-0x4(%ebp)
  67. return 0;
  68. 8048412: b8 00 00 00 00 mov $0x0,%eax
  69. }
  70. 8048417: c9 leave
  71. 8048418: c3 ret
  72. 8048419: 90 nop
  73. 804841a: 90nop
首要,C言语的进口都是从main函数开端的,可是从反汇编代码中能够发现并不是只要自己规划的代码,还存在许多关于初始化等操作。这首要是因为C言语的运转需求一些根本的环境和C-RunTime的一些根本函数。因而main 函数仅仅咱们C言语的进口,但并不是一个程序的开端。因而main函数也需求仓库的操控,也需求压栈出栈等操作。
需求留意的是:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/317708.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部