1. 汇编
在修习LINUX内核这门课的初始阶段,首先需要掌握的就是汇编以及汇编程序对于堆栈的操作。
下面我们就来分析一下一个简单地C程序是如何被汇编程序所表达的!
2. 得到汇编代码
首先,我们写一个简单地C程序,命名为exp1.c:
1 #include <stdio.h> 2 3 int g(int x) 4 { 5 return x+3; 6 } 7 8 int f(x) 9 { 10 return g(x); 11 } 12 13 int main() 14 { 15 return f(8)+1; 16 } |
程序非常的简单,我们此时再通过编译指令将其编译为汇编程序:
1 gcc –S –o main.s main.c -m32
这样我们就得到了这个简单C程序的汇编代码:
1 .file "exp1.c" 2 .text 3 .globl g 4 .type g, @function 5 g: 6 .LFB0: 7 .cfi_startproc 8 pushl %ebp 9 .cfi_def_cfa_offset 8 10 .cfi_offset 5, -8 11 movl %esp, %ebp 12 .cfi_def_cfa_register 5 13 movl 8(%ebp), %eax 14 addl $3, %eax 15 popl %ebp 16 .cfi_def_cfa 4, 4 17 .cfi_restore 5 18 ret 19 .cfi_endproc 20 .LFE0: 21 .size g, .-g 22 .globl f 23 .type f, @function 24 f: 25 .LFB1: 26 .cfi_startproc 27 pushl %ebp 28 .cfi_def_cfa_offset 8 29 .cfi_offset 5, -8 30 movl %esp, %ebp 31 .cfi_def_cfa_register 5 32 subl $4, %esp 33 movl 8(%ebp), %eax 34 movl %eax, (%esp) 35 call g 36 leave 37 .cfi_restore 5 38 .cfi_def_cfa 4, 4 39 ret 40 .cfi_endproc 41 .LFE1: 42 .size f, .-f 43 .globl main 44 .type main, @function 45 main: 46 .LFB2: 47 .cfi_startproc 48 pushl %ebp 49 .cfi_def_cfa_offset 8 50 .cfi_offset 5, -8 51 movl %esp, %ebp 52 .cfi_def_cfa_register 5 53 subl $4, %esp 54 movl $8, (%esp) 55 call f 56 addl $1, %eax 57 leave 58 .cfi_restore 5 59 .cfi_def_cfa 4, 4 60 ret 61 .cfi_endproc 62 .LFE2: 63 .size main, .-main 64 .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" 65 .section .note.GNU-stack,"",@progbits |