根据本周所学知识分析汇编代码的工作过程,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:

  • 题目自拟,内容围绕计算机是如何工作的进行;

  • 博客中需要使用实验截图

  • 博客内容中需要仔细分析汇编代码的工作过程中堆栈的变化

  • 总结部分需要阐明自己对“计算机是如何工作的”理解。

 

原文链接

一、测试具有返回值的函数调用过程

  1. C代码
1 int r(int x)
2 {
3     return x+3;
4 }
5 
6 int main(void)
7 {
8     return r(r(5));
9 }

  2.编译

vi 输入前述代码

使用以下命令编译

 gcc -S -o return.s return.c -m32 

-S表示编译查成汇编

-o表示输入文件名

#1:GCC常用参数详解

   3.查看编译结果

    3.1 X86

 1 r:
 2     pushl    %ebp
 3     movl    %esp, %ebp
 4     movl    8(%ebp), %eax
 5     addl    $3, %eax
 6     popl    %ebp
 7     ret
 8 main:
 9     pushl    %ebp
10     movl    %esp, %ebp
11     subl    $4, %esp
12     movl    $5, (%esp)
13     call    r
14     movl    %eax, (%esp)
15     call    r
16     leave
17     ret

    3.2 ARM

 1 r:
 2         str     fp, [sp, #-4]!
 3         add     fp, sp, #0
 4         sub     sp, sp, #12
 5         str     r0, [fp, #-8]
 6         ldr     r3, [fp, #-8]
 7         add     r3, r3, #3
 8         mov     r0, r3
 9         add     sp, fp, #0
10         ldmfd   sp!, {fp}
11         bx      lr
12 main:
13         stmfd   sp!, {fp, lr}
14         add     fp, sp, #4
15         mov     r0, #5
16         bl      r
17         mov     r3, r0
ARM CPU汇编

 

  4.堆栈、寄存器情况

   5.结论

    GCC将上述C程序编译成汇编时,使用寄存器eax传递函数返回值

  6.递归调用

1 int Self(x)
2 {
3     return Self(x);
4 }
5 
6 int main()
7 {
8     Self(5);
9 }
 1 Self:
 2     pushl    %ebp
 3     movl    %esp, %ebp
 4     subl    $24, %esp
 5     movl    8(%ebp), %eax
 6     movl    %eax, (%esp)
 7     call    Self
 8     leave
 9     ret
10 
11 main:
12     pushl    %ebp
13     movl    %esp, %ebp
14     andl    $-16, %esp
15     subl    $16, %esp
16     movl    $5, (%esp)
17     call    Self
18     leave
19     ret

7.总结

作业要求写总结,其实也没什么可以总结的,无非就是让计算机干什么,它就干什么,一个寄存器、一段内存一步一步完全按照程序去移动数据。

最后安利一个《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

by:魏文鹏

引用:

#1:GCC常用参数详解