你的位置:首页 > 操作系统

[操作系统]冯诺依曼体系结构

1.冯诺依曼体系结构(存储程序计算机)

1.1 解释

  • 从硬件角度可以抽象为一下模型:

be6fe966-3e5e-4681-a7d9-ce9cad853fb0

CPU与内存通过总线连接,CPU中有很多寄存器(总是指向内存的某一块区域),如IP(Instruction Pointer)。假如指向CS(Code Segment,代码段),CPU从IP指向的内存的地址,取指令执行,执行过后IP自加1,取下一条指令,重复上述步骤。

  • 从程序员的角度可以抽象为一下模型:

359c1e16-2ff6-4e8b-a906-99edb280f4f1

CPU不断执行next instruction,从内存取指令不断执行。

内存保存数据和指令,CPU负责解释和执行指令。

1.2 API和ABI

cpu识别什么指令,怎么定义?

API:程序员与计算机的接口界面

ABI:程序与CPU的接口界面

2.×86寄存器

2.1 通用寄存器

5e6f01fe-8045-497e-848c-3073198b1d9b

2.2 段寄存器

bc05bf30-707c-4553-814e-cd1b95b95ba5

CPU在实际取指令是根据cs:eip来确定一个指令

3.×86汇编指令

指令

含义

模式/模型

movl %eax,%edx

edx=eax

register mode,以%开头的寄存器标示符

movl $0x123,%edx

edx=0x12

immediate,立即数以$开头的数值

movl 0x123(没有$符表示地址),%edx

edx=*(int32_t*)0x123

direct,直接访问一个指定的内存地址的数据

movl (%ebx)(ebx寄存器存的值——内存地址,加括号表示内存地址存的数据放在ebx),%edx

edx=*(int32_t*)ebx

indirect,将寄存器的值作为一个内存地址来范围内存

movl 4(%ebx),%edx

edx=*(int32_t*)(ebx+4)

displaced,在间接寻址时改变寄存器的值

pushl %eax

subl $4,%esp
movl %eax,(%esp)

clip_image002

popl %eax

movl(%esp),%eax
addl $4,%esp

call 0x12345(调用0x12345地址)

pushl %eip(*)(当前的eip压栈)
movl $0x12345,%eip(*)(立即数放在eip)

ret

popl %eip(*)

enter

pushl %ebp
movl %esp,%ebp

leave

movl %ebp,%esp
popl %ebp

b,w,l,q分别代表8位,16位,32位,64位

eip指向内存的指令,自加一(一条指令),*代表这些指令不能被程序员直接使用,程序不能直接修改eip寄存器

4.汇编代码分析

#include <stdio.h>

int g(int x)

{

return x + 3;

}

 

int f(int x)

{

return g(x);

}

 

int main(void)

{

return f(8) + 1;

}

gcc -S -o main.s main.c -m32,对应的汇编代码

g:

pushl %ebp

movl %esp, %ebp

movl 8(%ebp), %eax

addl $3, %eax

popl %ebp

ret

f:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl 8(%ebp), %eax

movl %eax, (%esp)

call g

leave

ret

main:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl $8, (%esp)

call f

addl $1, %eax

leave

ret

动画演示:

6