计算机组成与设计---硬件/软件接口---指令: 计算机的语言
Posted FANCY PANDA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机组成与设计---硬件/软件接口---指令: 计算机的语言相关的知识,希望对你有一定的参考价值。
名字 | 示例 | 注释 |
---|---|---|
32个寄存器 | $ s0~ $ s7, $ t0~ $ t9, $ zero, $ a0~$ a3, $ v0 ~ $ v1, $ gp, $ fp, $ sp, $ra, $at | 寄存器用于数据的快速取.在MIPS中,只能对存放在寄存器中的数据执行算术操作,寄存器$ zero的值恒为0,寄存器$at被汇编器保留,用于处理大的常数 |
2^30个存储器字 | Memory[0], Memory[4], …Memory[4294967292] | 存储器只能通过数据传输指令访问。MIPS使用字节编址,所以连续的字地址相差4。存储器用于保存数据结构、数组和溢出的寄存器 |
硬件设计的三原则:
- 简单源于规整
- 越小越快
- 优秀的设计需要适宜的折中方案
2.1计算机硬件的操作
- 加法和减法,都是三操作数
-
- 两个源操作数,一个目的操作数
add a, b, c # a = b + c
- 两个源操作数,一个目的操作数
- 注释用#开头
- 所有的算术运算都是这样的形式
- 设计原则一:简单源于规整
-
- 规整使实现简单
-
- 简单能获得低成本高性能
2.2 计算机硬件的操作数
- 算术运算指令使用寄存器操作
- MIPS有32个32位 寄存器
-
- 用于存储频繁使用的数据
-
- 编号0 到31
-
- 32位数码称为一个字
- 编译时名称的约定
-
- $t0, $t1, …, $t9 表示临时寄存器
-
- $s0, $s1, …, $s7 用于存储变量
- 设计原则二:越少越快
-
- 对照主存:数以百万计的存储位置
2.2.1 存储器操作数
- 主存可以存储复杂数据
-
- 数组,结构,动态数据
- 使用算术运算操作数
-
- 从主存把数读入到寄存器
-
- 把结果从寄存器存储到主存
- 存储器按字节编址
-
- 每个地址表示一个8位字节
- 按字存放在内存
-
- 每个地址必须是4个字节
- MIPS按大端编址
-
- 高位存放在低地址
-
- 对照小端模式:低位放到低地址
如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示:
地址偏移 | 大端模式 | 小端模式 |
---|---|---|
0x00 | 12(OP0) | 34(OP1) |
0x01 | 34(OP1) | 12(OP0) |
- 寄存器的访问速度比主存快得多
- 对主存储器数据的操作要用
- 取数指令lw (load word)
- 存数指令sw (store word)。
-
- 需要执行更多的指令
- 编译器必须尽量使用寄存器访问变量
-
- 仅当寄存器不够用时才把不经常使用的变量放到内存
-
- 寄存器的高效利用对系统优化非常重要
2.2.2常数或立即数操作数
-
指令中使用常数
addi $s3, $s3, 4(immediate)
-
没有减去立即数的减法指令
-
- 可以使用负常数,即“加负数”实现减法
addi $s2, $s1, -1
- 可以使用负常数,即“加负数”实现减法
-
设计规则三:加速执行常用操作
-
- 小常数操作出现的频率高
-
- 立即数操作不用到内存取数
-
MIPS寄存器0($zero)表示常数0
-
- 不能被改写
-
在常用的操作中,很有用
-
- 例如,可在寄存器之间传送数据
add $t2, $s1, $zero
- 例如,可在寄存器之间传送数据
2.3有符号数和无符号数
二进制无符号整数
范围: 0 to +2n – 1
二进制补码表示有符号整数
范围: –2n – 1 to +2n – 1 – 1
- 31位是符号位
-
- 1表示负数
-
- 0表示非负
- –(–2n – 1) 不能表示
- 非负数的无符号数和二进制补码是相同的
有符号数(二进制补码)的取反 - 取反加1
-
- 取反的含义1 → 0, 0 → 1
- 取反的含义1 → 0, 0 → 1
2.4 计算机中指令的表示
指令系统对指令系统的要求:
- 完备性: 指令齐全,编程方便
- 高效性:占内存少,运行省时
- 规整性:指令与运算规则统一
- 兼容性:新旧机指令软件兼容
MIPS字段:
- 指令字段
-
- op: 操作码(opcode)
-
- rs: 第一个源寄存器编号
-
- rt: 第二个源寄存器编号
-
- rd: 目的寄存器编号
-
- shamt: 移位位数(00000 表示不移位)
-
- funct: 功能码(扩展操作码)
R-型(寄存器)操作举例
add $t0, $s1, $s2
I型(立即数指令)
- 立即数的算术和读数/存数指令
-
- rt: 目的或源寄存器编号
-
- 常数的取值范围: –2^15 to +2^15 – 1
-
- 地址:偏移加上rs中的基址
- 设计原则3:优秀的设计需要适宜的折中方案
-
- 不同类型指令采用不同的解码方式,但都是32位相同的指令长度
-
- 尽可能保持相似的指令格式
2.5 逻辑操作
- 对位进行处理的指令
- 用于对字中的若干 “位”
- 打包和拆包的操作
移位操作
- shamt: 移多少位
- 逻辑左移sll
-
- 左移空位填0
-
- 逻辑左移i位相当于乘2^i
- 逻辑右移srl
-
- 逻辑右移空位填0
-
- 逻辑右移i位相当于除2i(仅对无符号数)
“与”操作
- 可用于一个字中的掩码操作
- 选择某些位,其他位清零
and $t0, $t1, $t2
“或”操作
- 用于把包含字中的一些位置1,其他位不变
or $t0, $t1, $t2
按位“取反”操作
-
用于改变字中的一些位
-
- 0变成1,1变成0
-
MIPS 3-操作数指令NOR
-
- a NOR b == NOT ( a OR b ) “或非”
nor $t0, $t1, $zero
- a NOR b == NOT ( a OR b ) “或非”
2.6 决策指令
- 如果条件为真,跳转到被标签的指令执行
-
- 否则,继续执行
- beq rs, rt, L1
-
- if (rs == rt)转到标签为L1的指令执行
- bne rs, rt, L1
-
- if (rs != rt)转到标签为L1的指令执行;
- j L1
-
- 无条件跳转到标签为L1的指令执行
2.6.1循环
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: …
2.6. 2 case/switch 语句
while (save[i] == k)
i += 1;
Loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit: …
2.7计算机硬件对过程的支持
2.7.1 使用更多的寄存器
寄存器的使用
- $a0 – $a3: 传递参数 (reg’s 4 – 7)
- $v0, $v1: 返回结果值 (reg’s 2 and 3)
- $t0 – $t9: 临时寄存器
-
- 可以被调用者改写
- $s0 – $s7: 保存参数
-
- 必须被调用者保存和恢复
- $gp: 静态数据的全局指针寄存器(reg 28)
- $sp: 栈指针寄存器stack pointer (reg 29)
- $fp: 帧指针寄存器(frame pointer) , 保存过程帧的第一个字 (reg 30)
- $ra:返回地址寄存器 return address (reg 31)
过程调用指令
- 过程调用:跳转和链接
jal ProcedureLabel
- 下一条指令的地址在寄存器$ra中
- 跳转到目标地址
- 过程返回:寄存器跳转 jump register
jr $ra
- 拷贝$ra到程序计数器
- 也被用于运算后跳转
2.8 MIPS中32位立即数和寻址
2.9.1 32位立即数
lui rt, constant
- 取立即数并放到高16位
注:Ori立即数或,$ s0与常数2304“或”,结果放在$s0形成一个32位的常数
2.9.2分支和跳转中的寻址
分支指令说明
- -操作码,两个寄存器,两个地址
- 大多数跳转目标离跳出的位置较近
- 向前或向后
PC相对寻址 - 目标地址 = PC + offset × 4
- 此时PC的增加量是4的倍数
跳转(j和jal)的目标地址可以在代码段的任何位置
- 指令除op外,指令其它字段都是地址
- 直接跳转到地址
- Target address = PC31…28 : (address × 4)
2.8.3 MIPS寻址模式总结
2.9并行与指令:同步
- 处理器共享存储器同一区域
- P1 写, P2 读
- (任务1写的结果是任务2要读取得值)
- 如果P1和P2不同步,将发生数据竞争
- 结果由访问次序决定
- 依赖硬件提供同步指令
- 例如:lock和unlock指令,控制一个“互斥区”
- 原子读/写内存操作
- 在读和写之间,不再允许对该空间的其他操作
- 可以是单一的指令
- 例如寄存器和内存之间的原子交换
- 或者指令的原子配对
2.10 翻译并执行程序
编译器:编译器将C程序转换成一种机器能理解的符号形式的汇编语言程序
汇编器:
- 汇编器(或编译器)把程序翻译成机器语言提供从部分构建完整程序的信息
- 目标文件头:描述目标文件其他部分的大小和位置
- 正文段:翻译后的指令,包含机器语言代码
- 静态数据段:包含在程序生命周期内分配的数据
- 重定位信息:标记了一些程序加载进内存时依赖于绝对地址的指令和数据
- 符号表:全局定义和外部引用
- 调试信息:用于关联源文件
链接器:
产生一个可执行的映像
- 合并段(代码和数据数据库象征性放入内存)
- 决定数据和指令标签的地址
- 修补引用(内部和外部引用)
可以留下依靠重定位程序修复的部分
- 但虚拟内存,不需要做这些
- 虚拟内存空间,程序必须以绝对地址装入
加载器
把待执行的程序从硬盘的镜像文件读入内存
- 读取可执行文件头来确定正文段和数据段的大小
- 为正文和数据创建一个足够大的地址空间
- 把指令和初始数据拷贝到内存或者设置页表项,使它们可用
- 把主程序的参数复制到栈顶
- 初始化寄存器(包括堆栈指针 s p , 帧 指 针 sp, 帧指针 sp,帧指针fp, 全局指针$gp )
- 跳转到启动进程
-
- 复制参数到寄存器并调用主函数main
-
- 主函数返回时,通过系统调用exit终止程序
动态链接库:
调用时,只是连接或装入库文件
- 过程代码重定位;
- 避免所有程序中出现的链接库;但是这些库的信息是一次性代入内存,占用内存空间。只是在用到的时候才链接该库;
- 自动装入最新的编译器中的版本的动态库。
2.11 数组与指针
2.11.1 用数组实现clear
2.11.2 用指针实现clear
2.11.3 比较两个版本的clear
-
乘指令长度的操作变成移位操作
-
- 下标计算用i的自增操作
-
- 相对于而后者 增加指针
-
编译器可以获得和手动使用指针相同的效果
-
- 引导变量删除
-
- 可以使程序更清晰,更安全
以上是关于计算机组成与设计---硬件/软件接口---指令: 计算机的语言的主要内容,如果未能解决你的问题,请参考以下文章