计算机组成与设计---硬件/软件接口---指令: 计算机的语言

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)中。这个短整型变量在内存中的存储在大小端模式由下表所示:

地址偏移大端模式小端模式
0x0012(OP0)34(OP1)
0x0134(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
      在这里插入图片描述

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

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程序转换成一种机器能理解的符号形式的汇编语言程序

汇编器

  • 汇编器(或编译器)把程序翻译成机器语言提供从部分构建完整程序的信息
  • 目标文件头:描述目标文件其他部分的大小和位置
  • 正文段:翻译后的指令,包含机器语言代码
  • 静态数据段:包含在程序生命周期内分配的数据
  • 重定位信息:标记了一些程序加载进内存时依赖于绝对地址的指令和数据
  • 符号表:全局定义和外部引用
  • 调试信息:用于关联源文件

链接器
产生一个可执行的映像

  1. 合并段(代码和数据数据库象征性放入内存)
  2. 决定数据和指令标签的地址
  3. 修补引用(内部和外部引用)

可以留下依靠重定位程序修复的部分

  1. 但虚拟内存,不需要做这些
  2. 虚拟内存空间,程序必须以绝对地址装入

加载器
把待执行的程序从硬盘的镜像文件读入内存

  1. 读取可执行文件头来确定正文段和数据段的大小
  2. 为正文和数据创建一个足够大的地址空间
  3. 把指令和初始数据拷贝到内存或者设置页表项,使它们可用
  4. 把主程序的参数复制到栈顶
  5. 初始化寄存器(包括堆栈指针 s p , 帧 指 针 sp, 帧指针 sp,fp, 全局指针$gp )
  6. 跳转到启动进程
    • 复制参数到寄存器并调用主函数main
    • 主函数返回时,通过系统调用exit终止程序

动态链接库
调用时,只是连接或装入库文件

  • 过程代码重定位;
  • 避免所有程序中出现的链接库;但是这些库的信息是一次性代入内存,占用内存空间。只是在用到的时候才链接该库;
  • 自动装入最新的编译器中的版本的动态库。

2.11 数组与指针

2.11.1 用数组实现clear

在这里插入图片描述

2.11.2 用指针实现clear

在这里插入图片描述

2.11.3 比较两个版本的clear

  • 乘指令长度的操作变成移位操作

    • 下标计算用i的自增操作
    • 相对于而后者 增加指针
  • 编译器可以获得和手动使用指针相同的效果

    • 引导变量删除
    • 可以使程序更清晰,更安全

计算机组成与设计—硬件/软件接口—计算机概要与技术

计算机组成与设计—硬件/软件接口—计算机的算术运算

计算机组成与设计—硬件/软件接口—处理器

计算机组成与设计—硬件/软件接口—大容量和高速度:开发存储器层次结构

以上是关于计算机组成与设计---硬件/软件接口---指令: 计算机的语言的主要内容,如果未能解决你的问题,请参考以下文章

计算机组成与设计---硬件/软件接口---指令: 计算机的语言

学习笔记----计算机组成与设计:硬件软件接口

计算机组成与设计:硬件/软件接口的目录

计算机组成与设计硬件/软件接口 (MIPS版) a y

计算机组成与设计---硬件/软件接口---计算机概要与技术

计算机组成与设计---硬件/软件接口---计算机概要与技术