linux内核分析 第一周 计算机是如何工作的 20125221银雪纯
我使用的c语言代码是:
- int g(int x)
- {
- return x + 1;
- }
- int f(int x)
- {
- return g(x);
- }
- int main(void)
- {
- return f(6) + 3;
- }
使用实验楼的linux环境得到的汇编代码如下:
1 g:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 8(%ebp), %eax
5 addl $1, %eax
6 popl %ebp
7 ret
8 f:
9 pushl %ebp
10 movl %esp, %ebp
11 subl $4, %esp
12 movl 8(%ebp), %eax
13 movl %eax, (%esp)
14 call g
15 Leave
16 ret
17 main:
18 pushl %ebp
19 movl %esp, %ebp
20 subl $4, %esp
21 movl $6, (%esp)
22 call f
23 addl $3, %eax
24 leave
25 ret
汇编代码的工作过程中堆栈的变化如下:
总结:
计算机是如何工作的。
冯·诺依曼结构:从硬件的角度:CPU通过总线和内存连接,CPU从IP所指的代码段取指令执行。
从程序员的角度:内存负责保存指令,CPU负责执行指令。
CPU怎么识别,识别什么样的指令:
API 程序员与计算机的接口
ABI 程序与CPU的接口
约定指令是用什么寄存器
x86计算机中,eip是自加一的指向一个指令,自加一是加一条指令,而非字节等,eip还可以被其他指令修改,如跳转调用指令。
CPU在实际取指令时根据CS:eip来准确定位一个指令。
linux内核使用的是AT&T汇编格式。