码迷,mamicode.com
首页 > 其他好文 > 详细

冯诺依曼体系结构

时间:2016-04-13 02:04:19      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:

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

1.1 解释

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

技术分享

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

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

技术分享

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

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

1.2 API和ABI

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

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

ABI:程序与CPU的接口界面

2.×86寄存器

2.1 通用寄存器

技术分享

2.2 段寄存器

技术分享

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)

技术分享

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

动画演示:

技术分享

冯诺依曼体系结构

标签:

原文地址:http://www.cnblogs.com/boyiliushui/p/5385106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!