Open iidear opened 5 years ago
硬件/软件接口,指计算机指令集体系结构,内容主要为硬件如何解释执行指令,以及当前计算机的多处理器并行结构和多级存储器缓存结构。
计算机分类:个人计算机、超级计算机、服务器、嵌入式计算机
计算机软硬件
计算机语言层次:高级语言、汇编语言、机器语言
计算机系统结构中的8个伟大思想
性能衡量与测试
处理器的功耗
R型指令分为5段
I型指令分3段:其中的 rd、shamt、funct 共16位用于存放立即数。
假定 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 | - |
eg. 左移 sll $t2, $s0, 4 # reg $t2 = reg $s0 << 4 bit
op | rs | rt | rd | shamt | funct |
---|---|---|---|---|---|
0 | 0 | 16 | 10 | 4 | 0 |
条件分支
beq reg1, reg2, L1
bne reg1, reg2, L1
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:
用形式逻辑的方法可以很容易看到,在理论上存在者某种“指令集”足以控制任何的操作序列并使之执行...
过程:根据提供的参数执行一定任务的存储的子程序。
调用者将参数值放在 $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
内存地址由高到低
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
现代计算机的内部电路为数字电路。数字电路仅工作在两个电压:高电压和低电压。分别对应到 有效信号(逻辑1) 和 无效信号(逻辑0).
温故知新