根据本周所学知识分析汇编代码的工作过程,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:
-
题目自拟,内容围绕计算机是如何工作的进行;
-
博客中需要使用实验截图
-
博客内容中需要仔细分析汇编代码的工作过程中堆栈的变化
-
总结部分需要阐明自己对“计算机是如何工作的”理解。
一、测试具有返回值的函数调用过程
- 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
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常用参数详解
浙公网安备 33010602011771号