Textbook:
《计算机组成与设计——硬件/软件接口》    HI
《计算机体系结构——量化研究方法》           QR


这节我们来看CPU内部的一些东西。

Instruction Set Architecture

指令集是介于硬件(CPU microarchitecture / IO / ....)和软件(compiler / OS / ....)之间的一个interface。硬件(486-586-PentiumPro)和软件(Win98-WinXP)都会更新换代,但指令集很少变化(比如x86)。现在比较流行的是General-purpose register architecture,这也是我们重点学习的。早期还有stack architecture和accumulator architecture,不过已经不流行了...

Java VM:HI P89

Register

寄存器是在cpu内部的存储单元,访问简单,速度也非常快。

和前面说的cache不同,寄存器是对软件可见的(explictly managed)。比如下面的一段程序:

 void foo(){
....
} void bar(){
int a,b;
a=;
foo();
printf("%d\n", a);
}

foo()和bar()都可能会用满所有的寄存器。那么在Line 8调用foo()之前,编译器就要手动把bar()当前运行时寄存器的值备份一下(存到stack),等foo()结束后再还原回来。

Memory Addressing

指令可以分为以下几类:

  • Load/Store就是在内存和寄存器之间搬运数据......
  • ALU operation是用来计算的。它操作数据的主要来源是寄存器
    • 在RISC中,ALU inst只能从寄存器中读写,不能读内存地址。而在x86中一条指令最多可以读写1个内存地址

那么指令是如何进行memory addressing呢?要考虑如下几个问题:

  1. Bytes addressed。即每个地址包含多少个byte。大多数情况下是一次读一个byte(参考这张图)。也有些奇怪的机器是一次读一个word(多个bytes)
  2. Little/Big Endian
  3. Alignment。比如4bytes alignment表示每个数据的起始地址必须是4 bytes的倍数。

Addressing Mode:(PPT P6)

Control Flow Instructions

分支指令

几种常见的ISA

CISC:硬件资源少,人类手些汇编的硬核年代......指令集比较复杂,并且提供一些复杂指令,以便让program的汇编代码量尽量小

RISC:此时硬件资源已经多了,编译器技术也好一些了。因此需要只包括更简单的指令(fixed length,涉及更少的hardware control),以便支持instruction-level parallelism。这样即使需要的指令多了,但总体来看还是快不少。load-store architecture

但其实现在CISC和RISC差距已经没有很大了......像CISC的x86指令集,也加入了很多RISC的特性。比如用RISC Engine来执行microcode(动态解码后的CSIC指令)

RISC pipeline

PPT P14-

我们以Alpha为例来看看一个RISC ISA是怎样设计的吧。

指令种类:可以分为RR、RI、Load/Store、Branch、Jump五种(PPT P14-P16)

为了执行这些指令,我们定义了一个五级的流水线:

  • IF:Fetch 32bit instructions,并送到instruction memory
  • ID:Decode Instruction(通过电路...),然后送到对应的component
  • EX:进行计算
  • MEM:(有可能)涉及到访问内存
  • WB:将结果写回寄存器(Reg Array)

我们分别看看这五种指令各自是如何执行的:

PPT P19-24

......

最新文章

  1. Java 网络爬虫获取网页源代码原理及实现
  2. jquery replace用法汇总
  3. 【SQL 代码】Sql分页(自用)
  4. 设计模式-中介者模式(Mediator)
  5. 问题-WIN7 ..\Bin\InitCC32.exe".进程无法访问(拒绝访问)
  6. json 序列化和反序列化
  7. Redis 11种Web应用场景举例
  8. Extjs2.0 desktop 动态创建桌面图标和开始菜单
  9. 指针变量的*p,p以及&p的区别
  10. hadoop2.6.0实践:引入开发依赖的jar包
  11. centos 7下安装python 3.6笔记
  12. WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)
  13. ansible常用命令
  14. [ARCH] 1、virtualbox中安装archlinux+i3桌面,并做简单美化
  15. 用excel记录测试bug问题总结
  16. pycharm 使用教程
  17. Mysql的命令总结
  18. linux使用指导-debian/archlinux/LFS
  19. Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance
  20. web页面中a标签下载文件包含中文下载失败的解决

热门文章

  1. 小程序获取Unionid
  2. 序列式容器————array
  3. 一个超详细vue无限滚动vue-infinite-scroll插件的配置及使用详解
  4. [LeetCode]-011-Roman_to_Integer
  5. zay大爷的神仙题目 D1T2-腐草为萤
  6. Flask基础以及Response三剑客
  7. 五、SpringBoot—HelloWorld案例
  8. mysql数据库连接错误10060
  9. postman通过引入外部文件实现参数化
  10. springMVC+Spring+Mybatis+Redis