iidear / blog

blog
0 stars 0 forks source link

《计算机组成与设计—硬件/软件接口》 #9

Open iidear opened 5 years ago

iidear commented 5 years ago

温故知新

iidear commented 5 years ago

硬件/软件接口,指计算机指令集体系结构,内容主要为硬件如何解释执行指令,以及当前计算机的多处理器并行结构和多级存储器缓存结构。

计算机概述

计算机分类:个人计算机、超级计算机、服务器、嵌入式计算机

计算机软硬件

计算机语言层次:高级语言、汇编语言、机器语言

计算机系统结构中的8个伟大思想

性能衡量与测试

处理器的功耗

iidear commented 5 years ago

指令:计算机的语言

进制与补码

存储程序模型/冯诺伊曼结构

计算机指令分类(以MIPS指令集为例)

MIPS使用32个寄存器

MIPS一条指令由32位组成。

R型指令分为5段

I型指令分3段:其中的 rd、shamt、funct 共16位用于存放立即数。

eg. C语言转化为MIPS机器语言

假定 A 的基址存放在 $t1,h 存放在 $s2.

C语言代码:A[300] = h + A[300]

转换为汇编语言:

lw $t0, 1200($t1)
add $t0, $s2, $t0
sw $t0, 1200($t1)

转换为机器语言(十进制表示):

op rs rt rd address/shamt funct
35 9 8 - 1200 -
0 18 8 8 0 32
43 9 8 - 1200 -

转换为机器语言(二进制):

op rs rt rd address/shamt funct
100011 01001 01000 - 0000010010110000 -
000000 10010 01000 01000 00000 100000
101011 01001 01000 - 0000010010110000 -
iidear commented 5 years ago

逻辑操作

eg. 左移 sll $t2, $s0, 4 # reg $t2 = reg $s0 << 4 bit

op rs rt rd shamt funct
0 0 16 10 4 0

决策指令

条件分支

eg.汇编 if (i== j) f = g + h; else f = g- h;,其中 f, g, h, i, j 依次对应 $s0 ~ $s4 的寄存器 对应 MIPS 汇编代码:

bne $s3, $s4, Else
add $s0, $s1, $s2
jump Exit
Else: sub $s0, $s1, $s2
Exit:

汇编器会完成分支指令的地址计算

循环 eg, while (save[i] == k) i += 1;,其中 i, k 存放在寄存器 $s3 和 $s5 中,数组 save 的基址存放在寄存器 $s6 中。 对应 MIPS 汇编代码:

Loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
jump Loop
Exit:
iidear commented 5 years ago

用形式逻辑的方法可以很容易看到,在理论上存在者某种“指令集”足以控制任何的操作序列并使之执行...

iidear commented 5 years ago

加算计硬件对过程的支持

过程:根据提供的参数执行一定任务的存储的子程序。

MIPS寄存器分配约定:

指令

调用过程

调用者将参数值放在 $a0 ~ $a3,然后使用 jal X 跳转到过程 X(此时会将 PC + 4 存在 $ra 中)。被调用者执行运算,将结果放在 $v0 和 $v1,然后使用 jr $ra 指令将控制返回给调用者。 如果用到需要保留的寄存器,执行前需要保存寄存器,执行后恢复寄存器。

eg. C 过程代码

int leaf_example (int g, int h, int i, int j) {
  int f;
  f = (g + h) - (i + j);
  return f;
}

编译为MIPS 汇编代码:

leaf_example:
addi $sp, $sp, -4
sw $s0, 0($sp)

add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero

lw $s0, 0($sp)
addi $sp, $sp, 4

jr $ra

eg. 递归 C 过程代码

int fact(int n) {
  if (n < 1) return 1;
  else return n * fact(n - 1);
}

编译成 MIPS 汇编代码:

fact:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)

slti $t0, $a0, 1
beq $t0, $zero, L1

addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra

L1: addi $a0, $a0, -1
      jal fact

lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8

mul $v0, $a0, $v0

jr $ra
iidear commented 5 years ago

内存分配

内存地址由高到低

iidear commented 5 years ago

eg. C 代码

void strcpy(char x[], char y[]) {
  int i;
  i = 0;
  while ((x[i] = y[i]) != '\0')
    i += 1;
}

编译为 MIPS 汇编代码:

addi $sp, $sp, -4
sw $s0, 0($sp)

add $s0, $zero, $zero
L1:
  add $t1, $s0, $a1
  lbu $t2, 0($t1)

  add $t3, $s0, $a0
  sb $t2, 0($t3)

  beq $t2, $zero, L2
  addi $s0, $s0, 1
  j L1

L2:
  lw $s0, 0($sp)
  addi $sp, $sp, 4
  jr $ra
iidear commented 5 years ago

逻辑设计基础

现代计算机的内部电路为数字电路。数字电路仅工作在两个电压:高电压低电压。分别对应到 有效信号(逻辑1)无效信号(逻辑0).

根据是否包含存储器件,逻辑电路被分为两大类:

描述组合逻辑的方式:

常用逻辑块