-
2021-07-17 06:25:46
指令系统指的是计算机所能执行的全部指令的集合,它描述了计算机内全部的控制信息和“逻辑判断”能力。它是软件和硬件的主要界面,反映了计算机所拥有的基本功能。
指令系统名词解释
指令系统就是计算机硬件的语言系统,也叫机器语言,指的是机器所具有的全部指令的集合,它是软件和硬件的主要界面,反映了计算机所拥有的基本功能。从系统结构的角度看,它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力,也决定了指令的格式和机器的结构。
指令系统是指计算机所能执行的全部指令的集合,它描述了计算机内全部的控制信息和“逻辑判断”能力。不同计算机的指令系统包含的指令种类和数目也不同。其中包含了算术运算型、逻辑运算型、数据传送型、判定和控制型、移位操作型、位(位串)操作型、输入和输出型等指令。指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如:操作码字段+地址码字段,其中操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。
更多相关内容 -
什么是指令和指令系统?
2021-07-26 05:06:44指令就是计算机程序发给计算机处理器的命令,英文...指令系统是计算机硬件的语言系统,一般也叫机器语言,指的是机器所具有的全部指令的集合,它是软件和硬件的最主要界面,同时反映了计算机所拥有的基本功能。从系...指令就是计算机程序发给计算机处理器的命令,英文名称是instruction。
最低级的指令是一串0和1,它表示一项实体作业操作要运行。系统根据指令类型,具体的存储领域被称作“寄存器(register)”,它里面包含了可用于调出指令的数据或数据存储位置。
指令系统是计算机硬件的语言系统,一般也叫机器语言,指的是机器所具有的全部指令的集合,它是软件和硬件的最主要界面,同时反映了计算机所拥有的基本功能。
从系统结构的角度看,它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力,也决定了指令的格式和机器的结构。
扩展资料:
指令格式
计算机的指令格式与机器的字长、存储器的容量及指令的功能都有很大的关系。从便于程序设计、增加基本操作并行性、提高指令功能的角度来看,指令中应包含多种信息。
但在有些指令中,由于部分信息可能无用,这将浪费指令所占的存储空间,并增加了访存次数,也许反而会影响速度。
因此,如何合理、科学地设计指令格式,使指令既能给出足够的信息,又使其长度尽可能地与机器的字长相匹配,以节省存储空间,缩短取指时间,提高机器的性能,这是指令格式设计中的一个重要问题。
性能要求
指令系统的性能决定了计算机的基本功能,它的设计直接关系到计算机的硬件结构和用户的需要。一个完善的指令系统应满足如下四方面的要求:
1、完备性,指用汇编语言编写各种程序时,指令系统直接提供的指令足够使用,而不必用软件来实现。完备性要求指令系统丰富、功能齐全、使用方便。
2、有效性,是指利用该指令系统所编写的程序能够高效率地运行。高效率主要表现在程序占据存储空间小、执行速度快。
3、规整性,包括指令系统的对称性、匀齐性、指令格式和数据格式的一致性。
对称性是指:在指令系统中所有的寄存器和存储器单元都可同等对待,所有的指令都可使用各种寻址方式。
匀齐性是指:一种操作性质的指令可以支持各种数据类型;
指令格式和数据格式的一致性是指:指令长度和数据长度有一定的关系,以方便处理和存取。
4、兼容性,至少要能做到“向上兼容”,即低档机上运行的软件可以在高档机上运行。
伪指令
伪指令(伪操作)不像机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作.它可以完成如处理器选择,定义程序模式,定义数据,分配存储区,指示程序结束等功能.伪指令在编译的时候并不生成代码.伪指令在编译之后就不存在了。
参考资料来源:百度百科-指令
-
代码揭秘:从C/C++的角度探秘计算机系统
2019-05-03 22:25:59经典书籍,主要讨论了包括计算机底层编码、内存与指针、计算机指令与代码系统、函数调用的机制、多级存储系统、线程与进程的概念以及代码优化等多个方面的话题。 -
计算机组成原理(4.1)—— 指令系统设计
2020-08-13 08:42:01从指令执行周期看指令设计涉及的问题三、指令系统设计1. 设计指令系统(1)设计原则(2)设计的重要方面2. 操作数类型和存储方式(1)指令应涉及的基本数据类型(2)IA32和MIPS中的数据类型3. 寻址方式(1)关于...文章目录
一、指令集体系结构(ISA)的基础概念
1. 指令相关概念
- CPU只能识别指令形式的机器语言(01序列),不管C、python还是什么高级语言,都需要翻译(编译、汇编、解释)为机器语言才能执行
- 指令可以分为三个类型
- 微指令:微程序级的命令,它属于硬件;
- 宏指令(伪指令):由若干条机器指令组成的软件指令,它属于软件;
- 机器指令:介于微指令和伪指令之间,处于硬件和软件的交界面,每一条指令可完成一个独立的算术运算或逻辑运算操作。一般讲的指令就是指机器指令
- 一条机器指令对应了硬件层面的一段微程序,微程序由若干微指令组成。比如在多周期CPU中执行一个加法指令,它可能对应了类似这样的一段微程序:从寄存器取操作数 -> 运算 -> 结果写回寄存器,这里就是三条微指令,每个机器周期执行一条。
- 机器指令就是一串二进制的01序列
- 指令集(指令系统):一台机器可以执行的机器指令的集合,它是ISA的核心组成部分
- 微架构:处理器核心的实现方式,是将一种给定的ISA在处理器中执行的方法
2. 什么是ISA
-
ISA(指令集体系结构)是一种规约(Specification),它规定了如何使用硬件,是一种对硬件的抽象
-
关系图
3. ISA的地位
(1)ISA是软件和硬件的交界面(接口)
- 计算机体系结构示意
- 指令系统处在软/硬件交界面,同时被硬件设计者和系统程序员看到
- 硬件设计者角度:指令系统为CPU提供功能需求,要求易于硬件设计
- 系统程序员角度:通过指令系统来使用硬件,要求易于编写编译器
- ISA是对硬件的抽象,所有软件功能都建立在 ISA之上
(2)ISA是计算机的必要组成部分
- ISA是最贴近CPU的,它规定了CPU可以理解的机器码语法以及部分CPU设计要求,因此它在计算机体系结构的发展中一直存在。它是CPU的接口,只要有计算机硬件,就有ISA。
- 操作系统、各种层次的编程语言等等都是建立与ISA之上的,它们即使这些都没有,我们直接写机器码也可以让计算机正常工作
- 计算机体系结构的发展简图如下,可以看到其中都有ISA:
- 最早的计算机,用机器语言编程
- 之后出现了OS和汇编语言,可以执行多道程序
- 现代计算机体系结构
- 最早的计算机,用机器语言编程
- 最后附一张不同层次的计算机工作者对计算机的认识
- 下面,针对ISA的核心组成部分——指令集(指令系统),进行进一步介绍
二、指令格式设计
1. 一条指令必须包含的信息
2. 不同地址码个数的指令
- 这里的地址是指一个操作数所在的地址。它具体可能是寄存器编号、存储器地址、I/O端口或指令立即数等等…
3. 从指令执行周期看指令设计涉及的问题
- CPU的运行流程:
-
取指令 - 指令译码 - 计算地址取操作数 - 进行运算,得标志位 - 计算结果送目的地 - 计算下条指令地址
-
上面这种划分得比较细,一个标准五级流水线中是这样划分的:
取指 - 译码 - 执行 - 访存 - 写回
-
三、指令系统设计
1. 设计指令系统
(1)设计原则
- 应尽量短
- 要有足够的操作码位数
- 指令编码必须有唯一的解释,否则是不合法的指令
- 指令字长应是字节的整数倍
- 合理地选择地址字段的个数
- 指令尽量规整
(2)设计的重要方面
- 操作码的全部组成:操作码个数 / 种类 / 复杂度 (主存读写、自增、跳转四种指令已足够编制任何可计算程序,但程序会很长)
- 数据类型:对哪几种数据类型完成操作
- 指令格式:指令长度 / 地址码个数 / 各字段长度(看上面
一、2
部分) - 通用寄存器:个数 / 功能 / 长度
- 寻址方式:操作数地址的指定方式
- 下条指令的地址如何确定:顺序,PC+1;条件转移;无条件转移;……
- 一条指令的功能,一般通过对操作码进行不同的编码来定义; 操作码相同时,再由功能码进行区分(例如MIPS的R型指令)
2. 操作数类型和存储方式
操作数
:指令处理的对象,与高级语言的数据类型对应- 操作数存放在寄存器或内存单元中
(1)指令应涉及的基本数据类型
(2)IA32和MIPS中的数据类型
-
IA-32(英特尔32位体系架构,80386开始采用)
- 基本类型:字节、字(16位)、双字(32位)、四字(64位)
- 整数: 16位、32位、64位三种2-补码表示的整数;18位压缩8421 BCD码表示的十进制整数
- 无符号整数(8、16或32位)
- 近指针:32位段内偏移(有效地址)
- 浮点数:IEEE 754(80位扩展精度浮点数寄存器)
-
MIPS
- 基本类型:字节、半字(16位)、字(32位)、四字(64位)
- 整数: 16位、32位、64位三种2-补码表示的整数
- 无符号整数:(16、32位)
- 浮点数:IEEE 754(32位/64位浮点数寄存器)
3. 寻址方式
(1)关于寻址
寻址方式
:指令或操作数地址的指定方式。即:根据地址找到指令或操作数的方法,通常特指 “操作数的寻址”- 指令中如何表示寻址方式
- 没有专门的寻址方式位(由操作码确定寻址方式):如MIPS指令,一条指令中最多仅有一个主(虚)存地址,且仅有一到两种寻址方式。
- 有专门的寻址方式位:如X86指令,一条指令中有多个操作数,且寻址方式各不相同, 需要各自说明寻址方式,因此每个操作数有专门的寻址方式位
- 常用寻址方式:立即 / 直接 / 间接 / 寄存器 / 寄存器间接 / 偏移 / 堆栈…
(2)有效地址和地址编码
- 有效地址
- 地址编码
(3)指令的寻址
- 指令寻址
(4)操作数的寻址
1. 常用寻址方式
- EA是操作数在主存中的地址,得到EA后,还要访存才能得到操作数
- 操作数的真实位置
- 在指令中直接给出:立即寻址
- 在寄存器中:寄存器寻址
- 在主存中:以上除了立即和寄存器之外所有
- 在磁盘中:对于在主存中的操作数,可能发生 “缺页” ,此时操作数在磁盘中,需要被置换进主存
- 偏移寻址有三种,这块比较复杂,下面逐一分析
2. 三种偏移寻址方式详述
-
寻址算法思想
- 思维导图
- 可见,所谓偏移寻址就是利用基地址和地址偏移量计算目标地址,根据地址给出形式的不同,可以分成三种类型。
- 一般RISC机器不提供自动变址寻址,并将变址和基址寻址统一成一种 “偏移寻址方式”。比如MIPS就是这样的
- 思维导图
-
相对寻址:
EA=A+(PC)
- 定义:目标地址 = 相对于PC寄存器当前值的位移量为A的存储单元。指令地址码给出一个偏移量(带符号数),基准地址由PC寄存器隐含给出
- 注意:当前PC值可能是本条指令(没有指令预取,如单周期CPU)或下一条指令的地址(有指令预取,如流水线CPU)
- 可用来实现程序(公共子程序)的浮动 或 指定转移目标地址
-
公共子程序的浮动:
-
相对寻址实现相对转移
-
举例:双字节(2个字节)定长指令字,第一字节是操作码Jxx,第二字节是位移量D,用补码表示。目标地址范围不等于位移量D的表示范围,只有确定了是按字还是字节编址、位移量D是指指令条数还是单元数,才能确定目标地址范围。若D为字节单元数,跳转范围[-126,128]单元,[-63,64]条指令
-
假设使用流水线技术,有指令预取,按字节编址,指令长度为双字节,D代表单元数,则
目标地址 = (PC) +2 +D
。由于流水线,在取这条Jxx指令的时候,PC已经+1了,指令长度又是双字节,所以要先加2得到此刻Jxx指令的地址,然后再加单元偏移D得到目的地址 -
举例:若转移指令地址为2000H,转移目标地址为1FF0H,总是在取指令同时对PC增量(流水线),则转移指令第二字节位移量为多少?
-
举例:MIPS指令
beq $1, $2, Label_25
的转移目标地址为(PC)+4+4*25
,这里的25是指令条数而不是单元数,MIPS采用定长指令字,按字节编址,所有指令的长度都是32位(4字节)。 -
说明:MIPS采用定长指令字,按字节编址, 所有指令的长度都是32位(4字节)
-
-
-
基址寻址:
EA=A+(B)
- 定义:目标地址 = 相对于基址(B)处位移量为A的单元。指令地址码给出一个偏移量,基准地址 由基址寄存器B给出。 (例如MIPS指令
lw / sw $s2, 0x40($t1)
) - 可用来实现多道程序重定位 或 过程调用中参数的访问
- 基址寻址实现程序重定位
- 基址寻址实现程序重定位
- 定义:目标地址 = 相对于基址(B)处位移量为A的单元。指令地址码给出一个偏移量,基准地址 由基址寄存器B给出。 (例如MIPS指令
-
变址寻址:
EA=A+(I)
- 定义:目标地址 = 相对于首址A处位移量为(I)的单元。指令地址码给出一个基准(形式)地址A ,而偏移量(无符号数) 由变址寄存器 I 给出。(例如Intel 8086指令
MOV AL, [SI+1000H]
,这里SI就是I, 1000H就是A。) - MIPS中没有变址寄存器;IA32中有。
- 可为循环重复操作提供一种高效机制,如实现对线性SK表IP的方便操作
- 定义:目标地址 = 相对于首址A处位移量为(I)的单元。指令地址码给出一个基准(形式)地址A ,而偏移量(无符号数) 由变址寄存器 I 给出。(例如Intel 8086指令
4. 操作码编码
(1)定长操作码编码
-
思维导图
-
举例:IBM360/370的指令格式
- 可以看到,各种指令类型中,
OP
段(操作码)的编码长度都是一致的 - IBM360/370使用了定长操作码,变长指令字
- 可以看到,各种指令类型中,
(2)变长操作码编码
- 基本思想
- 将操作码的编码长度分成几种固定长的格式
- 指令格式:变长操作码、变长指令字
- 变长操作码编码有两种
- 扩展编码
- 哈夫曼编码
- PDP-11是典型的变长操作码机器
- 大多数指令集采用变长操作码编码这种方式
1. 哈夫曼编码
- 这就是数据结构中学习过的哈夫曼编码,可以有效压缩操作码的平均长度
- 通过构造一棵哈夫曼数,我们可以轻松获取每个操作码的哈夫曼编码,这里不展开说了
- 哈夫曼编码应用于指令设计时存在一些问题
- 操作码长度很不规整;
- 硬件译码困难
- 与地址码共同组成固定长的指令比较困难
2. 扩展编码
-
核心原则:任意操作码的编码不能是另一个操作码的编码的前缀
-
等长15/15/15扩展编码
-
等长8/64/512扩展编码
-
不等长操作码4/6/10扩展编码法
3. 设计操作码编码示例
-
设某指令系统指令字是16位,操作码从最高位开始,地址码都在最低位,每个地址码为6位。包含三类指令
- 二地址指令15条
- 一地址指令34条
- 其余为零地址指令
-
分析:
- 二地址指令格式:4位操作码 | 6位地址 | 6位地址
- 一地址指令:10位操作码 | 6位地址
- 零地址指令:16位操作码
-
编码设计:
5. 标志信息的生成与使用
(1)条件测试方式
-
在一些CPU设计中,条件转移指令通常根据
Condition Codes
(条件码
/CC
) 决定是否转移。如IA-32结构中的Jcc
系列指令 -
IA-32的
Jcc指
令示例,可见条件码cc本质上是由一些标志位的逻辑运算结果决定的,也就是说:标志位经过逻辑运算,可以进行逻辑判断或溢出检测等
-
常见的标志位由以下四种,对于带符号和无符号运算,标志生成方式有没有不同,因为电路不知道是无符号数还是带符号整数!
-
通过执行算术指令或显式地由比较和测试指令来设置CC(即设置标志位),它们(尤其是第二类)往往配合跳转转移系列指令
Jcc
使用- 第一类:如IA-32中的
add
,sub
等算术指令 - 第二类:如IA-32中的
cmp
,test
等指令
- 第一类:如IA-32中的
-
更多关于IA-32中标志相关的内容,请参考:IA-32汇编语言笔记(3)—— 简单传送、加减指令 & 标志寄存器
(2)标志寄存器
- IA-32系列结构中使用了标志寄存器(程序状态字寄存器)
PSW
,这是一个16位的寄存器。 它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位
(3)MIPS中没有标志位
- MIPS架构和IA-32的一个大区别就是MIPS没有标志位的概念,自然也没有标志寄存器PSW
- MIPS架构中,直接在ALU部件运算时生成转移发生、溢出发生等信号,这些信号被传输到其他部件控制动作发生
6. 指令设计风格
(1)按操作数位置指定风格
-
四种指令风格
-
指令风格比较
- 累加器型,因为所有运算都要用累加器,表达式复杂时,程序中移入移出累加器的指令增多
- 1975年开始,寄存器型指令集占主导地位。寄存器速度快,使用大量通用Reg减少访存;与堆栈型指令用到堆栈相比,编译高级语言中变量时,不用考虑顺序
-
不同指令集关于访存的比较
(2)按指令格式的复杂度来分
1. 复杂指令集计算机CISC
2. 精简指令集计算机RISC
-
第四章 指令系统.ppt
2019-06-19 17:25:38指令系统是计算机硬件的语言系统,也叫机器语言,指机器所具有的全部指令的集合,它是软件和...从系统结构的角度看,它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力 -
从零开始设计RISC-V处理器——指令系统
2022-01-04 18:38:22从零开始设计RISC-V处理器系列文章目录
(一)从零开始设计RISC-V处理器——指令系统
(二)从零开始设计RISC-V处理器——单周期处理器的设计
(三)从零开始设计RISC-V处理器——单周期处理器的仿真
(四)从零开始设计RISC-V处理器——ALU的优化
(五)从零开始设计RISC-V处理器——五级流水线之数据通路的设计
(六)从零开始设计RISC-V处理器——五级流水线之控制器的设计
(七)从零开始设计RISC-V处理器——五级流水线之数据冒险
(八)从零开始设计RISC-V处理器——五级流水线之控制冒险
(九)从零开始设计RISC-V处理器——五级流水线之分支计算前移
(十)从零开始设计RISC-V处理器——五级流水线之静态预测
本人本科生一枚,之前学习了计算机体系结构(RISC-V版)这本书,对CPU的设计产生了浓厚的兴趣,于是决定在寒假期间,自己动手设计一个基于RISC-V指令集的CPU,顺便写一些文章,记录自己的学习成果,如果文章中有不合理之处,希望大家能批评指正。
今天是第一天,首先进行指令的选取。
如下表所示,计划实现以下37条指令。
对指令的理解:
1.LUI:将20位立即数的值左移12位(低12位补零)成为一个32位数,将其写回rd。这一指令主要是为了在寄存器中存入比较大的立即数,比如,要想在寄存器X1中存入一个数,可以用addi指令实现(addi x1,x0,100),但这个数的范围有限(-2048~2047),因为addi指令的立即数部分只有12位,能表示最大的无符号数位0xfff(十进制4095),对应的有符号数的范围则为-2048到2047。当立即数超出这个范围,则需要用lui指令。如lui x1,0xffff ,二进制指令:00001111111111111111000010110111
汇编器执行结果如下:
2.AUIPC:将20位立即数的值左移12位(低12位补零)成为一个32位数,再加上该指令的pc值,再将结果写回rd。这条指令与lui类似,可能是为了实现PC在较大范围内跳转(仅仅是猜测,因为这条指令我还没有接触过)。如auipc x2,0xfff,二进制指令:00000000111111111111000100010111
当前PC为4,汇编器执行结果如下:
3.JAL:PC+4 的结果送 rd 但不送入PC,然后计算下条指令地
址。转移地址采用相对寻址,基准地址为当前指令地址
(即 PC),偏移量为立即数 imm20 经符扩展后的值的 2 倍。
在实际的汇编程序编写中,跳转的目标往往使用汇编程序中的 label,汇编器会自动根据 label 所在的地址计算出相对的偏移量赋予指令编码。如:
jal x3,label1 二进制:00000000100000000000000111101111
addi x4,x0,4
label1:
addi x5,x0,5
当前PC为 8,跳过给X4赋值这条指令,并且将12赋给X3寄存器,汇编器执行结果如下:
(补充:仔细分析上面jal指令的二进制会发现,立即数部分是4,4*2=8,PC+8=12,跳过中间的一条指令,这样看起来似乎没什么问题。但是再看jal的立即数部分,总共是20位,拼接起来是[20:1],这里为什么不是[19:0]?
观察其他的指令格式,如果立即数是12位,那么会表示为[11:0],但JAL,BEQ,BNE,BLT,BGE,BLTU,BGEU却例外。
于是引发了以下思考(个人观点,未经查证,以后深入学习之后再回来补充):假设立即数其实是21位的,即[20:0],只不过始终保持最低位为0,所以在指令中仅仅体现[20:1],这样一来,21位的立即数一定是2的倍数,将立即数乘以2之后,一定是4的倍数,这样就可以保证跳转后的PC一定是4的倍数。所以,对于一个label,假设当前指令为第0行,label为第几行,立即数[20:1]则为多少,这样,立即数最低位补0再乘以2,与当前PC相加,则为正确的跳转地址。
以上的假设便能够合理地解释立即数为[20:1]的原因。
基于以上假设再来看上面jal指令的二进制,发现并不是这样,在以上的假设中,立即数应该是2,但汇编器转化出来的立即数是4,所以要么是我的假设出了问题,要么是汇编器出了问题。
站在汇编器的角度,立即数就是20位的,不存在最低位补个0的说法,所以汇编器在计算立即数的时候,自然而然地就已经将立即数设置成2的倍数了。对于BEQ,BNE,BLT,BGE,BLTU,BGEU指令也是一样。
在这里我更愿意相信我的假设,也许并不一定正确,但这看起来似乎更合理。以上仅为个人拙见,日后深入学习后可能才会发现其中的奥妙。)
4.JALR:jalr 指令使用 12 位立即数(有符号数)作为偏移量,与操作数寄存器 rs1中的值相加,然后将结果的最低有效位置0。jalr指令将其下一条指令的 PC(即当前指令PC+4)的值写入其结果寄存器 rd。
如:
addi x4,x0,4
jalr x8,x4,8 二进制:00000000100000100000111111100111
addi x5,x0,5
addi x6,x0,6
addi x7,x0,7
jalr指令所在的PC为4,4+8=12,则跳向PC=12的指令,同时将8存入X8寄存器。汇编器执行结果如下:
5.BEQ:beq指令只有在操作数寄存器rs1中的数值与操作数寄存器rs2的数值相等时,才会跳转,跳转地址为offset的有符号扩展和最低位补0(即乘以2)的偏移量加上BEQ指令的地址。如:
addi x1,x0,1
label1:
add x1,x1,x1
addi x2,x0,2
beq x1,x2,label1 二进制:11111110001000001000110011100011汇编器执行结果如下:
6.BNE:bne指令只有在操作数寄存器rs1中的数值与操作数寄存器rs2的数值不相等时,才会跳转,跳转地址为offset的有符号扩展和最低位补0(即乘以2)的偏移量加上BNE指令的地址。如:
addi x1,x0,1
label1:
add x1,x1,x1
addi x2,x0,4
bne x1,x2,label1 二进制:11111110001000001001110011100011汇编器执行结果如下:
7.BTL:blt指令只有在操作数寄存器rs1中的数值小于操作数寄存器rs2的数值时(有符号数),才会跳转,跳转地址为offset的有符号扩展和最低位补0(即乘以2)的偏移量加上BLT指令的地址。如:
addi x1,x0,-1
label1:
add x1,x1,x1
addi x2,x0,-2
blt x1,x2,label1 二进制:11111110001000001100110011100011汇编器执行结果如下:
8.BGE:bge指令只有在操作数寄存器rs1中的数值大于或等于操作数寄存器rs2的数值时(有符号数),才会跳转,跳转地址为offset的有符号扩展和最低位补0(即乘以2)的偏移量加上BGE指令的地址。
(注意bge指令的条件是大于等于,而blt的条件是小于)如:
addi x1,x0,-1
label1:
add x1,x1,x1
addi x2,x0,-2
bge x1,x2,label1 二进制:11111110001000001101110011100011汇编器执行结果如下:
9.BLTU:bltu指令只有在操作数寄存器rs1中的数值小于操作数寄存器rs2的数值时(无符号数),才会跳转,跳转地址为offset的有符号扩展和最低位补0的偏移量加上BLTU指令的地址。如:
addi x1,x0,-1
label1:
add x1,x1,x1
addi x2,x0,2
bltu x1,x2,label1 二进制:11111110001000001110110011100011这里一定是不跳转的,X1的值为-2,但是将其看作是一个无符号的数,就是一个非常大的正数。汇编器执行结果如下:
有符号表示:
无符号表示:
10.BGEU:bgeu指令只有在操作数寄存器rs1中的数值大于或等于操作数寄存器rs2的数值时(无符号数),才会跳转,跳转地址为offset的有符号扩展和最低位补0的偏移量加上BGEU指令的地址。如:
addi x1,x0,-1
label1:
add x1,x1,x1
addi x2,x0,-2
bgeu x1,x2,label1 二进制:11111110001000001111110011100011这里一定是跳转一次的,因为刚开始时X1=X2,跳转一次后不会再跳转。
汇编器执行如果如下:有符号表示:
无符号表示:
11.SB:sb指令 将操作数寄存器rs2中的低8位数据,写回存储器如:
addi x1,x0,0xf1
addi x2,x0,0xf2
addi x3,x0,0xf3
addi x4,x0,0xf4
sb x1,0,x0
sb x2,1,x0
sb x3,2,x0
sb x4,3,x0汇编器执行结果如下:
12.SH:sh指令 将操作数寄存器rs2中的低16位数据,写回存储器。
如:
lui x1,0xf0f11
addi x1,x1,0x7ff
sh x1,12,x0汇编器执行结果如下:
寄存器X1:
数据存储器:
13.SW:sw指令 将操作数寄存器rs2中的32位数据,写回存储器。如:
lui x1,0xf0f11
addi x1,x1,0x7ff
sw x1,12,x0汇编器执行结果如下:
14.LB:lb指令从存储器中读回一个8位的数据,进行符号位扩展后写回寄存器rd。如:
lui x1,0x3ef12
addi x1,x1,0x7ff
sw x1,12,x0
lb x2,12,x0
lb x3,13,x0
lb x4,14,x0
lb x5,15,x0现在X1寄存器存入一个0x3ef127ff,然后将这32位数存入数据存储器,再从数据存储器中依次读一个字节并进行符号扩展后存入寄存器。汇编器执行结果如下:
X1寄存器:
数据存储器:
符号扩展写入寄存器:
15.LH:lh指令从存储器中读回一个16位的数据,进行符号位扩展后写回寄存器rd。如:
lui x1,0x3ef12
addi x1,x1,0x7ff
sw x1,12,x0
lh x2,12,x0
lh x3,13,x0
lh x4,14,x0
lh x5,15,x0汇编器执行结果如下:
数据存储器:
符号扩展写入寄存器:
(思考:这里的X5中的83是什么,调出来数据存储器的数据可以看到,由于这里的地址是非对其访问,读两个字节就需要访问两个存储块。因此,为了提升指令的运行效率,使用load和store指令时,尽量采用边界对齐的地址访问)16.LW:lw指令从存储器中读回一个32位的数据,写回寄存器rd。
如:
lui x1,0xf0f11
addi x1,x1,0x7ff
sw x1,0,x0
lw x2,0,x0汇编器的执行结果如下:
数据存储器:
寄存器:
17.LBU:lbu指令从存储器中读回一个8位的数据,进行高位补零扩展后写回
寄存器rd。如:
lui x1,0x3ef12
addi x1,x1,0x7ff
sw x1,12,x0
lbu x2,12,x0
lbu x3,13,x0
lbu x4,14,x0
lbu x5,15,x0汇编器的执行结果如下:
数据存储器:
零扩展写入寄存器:
18.LHU:lhu指令从存储器中读回一个16位的数据,进行高位补零扩展后写回寄存器rd。如:
lui x1,0x3ef12
addi x1,x1,0x7ff
sw x1,12,x0
lhu x2,12,x0
lhu x3,13,x0
lhu x4,14,x0
lhu x5,15,x0汇编器执行结果如下:
数据存储器:
零扩展写入寄存器:
19.SLT:slt指令将操作数寄存器rs1中的数值与寄存器rs2当作有符号数进行比较。小于则置一,即如果rs1中的值小于rs2中的值,则输出1,否则输出0,结果写回rd。如:
addi x1,x0,-1
addi x2,x0,1
slt x3,x1,x2汇编器执行结果如下:
20.SLTU:sltu指令将操作数寄存器rs1中的数值与寄存器rs2当作无符号数进行比。如果rs1中的值小于rs2中的值,则输出1,否则输出0,结果写回rd。如:
addi x1,x0,-1
addi x2,x0,1
sltu x3,x1,x2汇编器执行结果如下:
21.SLTI:slti指令将操作数寄存器rs1中的数值与12位立即数当作有符号数进行比较,如果rs1中的值小于立即数的值,则输出1,否则输出0,结果写回rd。如:
addi x1,x0,-1
slti x2,x1,1汇编器执行结果如下:
22.SLTIU:sltiu指令将操作数寄存器rs1中的数值与12位立即数当作无符号数进行比较,如果rs1中的值小于立即数的值,则输出1,否则输出0,结果写回rd。如:
addi x1,x0,-1
sltiu x2,x1,1汇编器执行结果如下:
23.SLL:逻辑左移(SLL)根据寄存器(rs2)中的移位量对寄存器(rs1)中的值执行逻辑左移,并存储在(rd)寄存器中。如:
addi x1,x0,4
addi x2,x0,0xf0
sll x3,x2,x1汇编器执行结果如下:
24.SRL:逻辑右移(SRL)根据寄存器(rs2)中的移位量对寄存器(rs1)中的值执行逻辑右移,左边空出来的位补0,并存储在(rd)寄存器中。如:
addi x1,x0,4
addi x2,x0,-0xf0
srl x3,x2,x1汇编器执行结果如下:
25.SRA:算数右移(SRA)根据寄存器(rs2)中的移位量对寄存器(rs1)中的值执行算数右移,左边空出来的位补符号位,并存储在(rd)寄存器中。如:
addi x1,x0,4
addi x2,x0,-0xf0
sra x3,x2,x1汇编器执行结果如下:
26.SLLI:slli指令根据5位立即数的移位量对寄存器(rs1)中的值执行逻辑左移(低位补零),并存储在(rd)寄存器中。
27.SRLI:srli指令根据5位立即数的移位量对寄存器(rs1)中的值执行逻辑右移(高位补零),并存储在(rd)寄存器中。
28.SRAI:srai指令根据5位立即数的移位量对寄存器(rs1)中的值执行算数右移(高位补入符号位),并存储在(rd)寄存器中。如:
addi x2,x0,-0xf0
slli x3,x2,4
srli x4,x2,4
srai x5,x2,4汇编器执行结果如下:
29.ADD:add指令将寄存器(rs1)与寄存器(rs2)中的值相加,并写回(rd)寄存器中。
30.SUB:sub指令将寄存器(rs1)与寄存器(rs2)中的值相减,并写回(rd)寄存器中。
31.ADDI:addi指令将操作数寄存器rs1的整数值与12位立即数进行加法操作,
结果写回寄存器rd。如:
addi x1,x0,-1
add x2,x1,x1
sub x3,x2,x1汇编器执行结果如下:
32.XOR:xor指令在寄存器(rs1)的内容和寄存器(rs2)的内容之间执行逐位逻辑“异或”运算,并存储在(rd)寄存器中。
33.OR:or指令在寄存器(rs1)的内容和寄存器(rs2)的内容之间执行逐位逻辑“或”运算,并存储在(rd)寄存器中。
34.AND:and指令在寄存器(rs1)的内容和寄存器(rs2)的内容之间执行逐位逻辑“与”运算,并存储在(rd)寄存器中。
35.XORI:xori指令将操作数寄存器rs1中的数值与12位立即数进行异或操作,
结果写回rd。
36.ORI:ori指令将操作数寄存器rs1中的数值与12位立即数进行或操作,
结果写回rd。
37.ANDI:andi指令将操作数寄存器rs1中的数值与12位立即数进行与操作,
结果写回rd。如:
addi x1,x0,0b11001100
addi x2,x0,0b00111111
xor x3,x1,x2
or x4,x1,x2
and x5,x1,x2
xori x6,x1,0b00111111
ori x7,x1,0b00111111
andi x8,x1,0b00111111汇编器执行结果如下:
以上就是计划实现的37条指令的用法。下一篇文章开始设计处理器。 -
指令系统,寻址方式
2018-12-23 19:01:52用高级语言或者是汇编语言编写的程序,如果要在计算机上执行,必须要利用编译程序或者是汇编程序把高级语言编写的程序,指令,或者是汇编指令变成由0,1...指令集就是计算机系统软件和硬件的交界面。 软件通过指令系... -
计算机指令系统
2020-05-27 12:01:48计算机指令系统性的发展,指令系统的性能要求,指令格式,操作数类型,指令和数据的寻址方式。 -
angular-directives-in-traction:任何角度开发人员从头开始学习角度指令的入门指南
2021-05-17 06:29:47牵引中的AngularJS指令 AngularJS是一个超级英雄JavaScript框架,使编写单页应用程序变...请下载源代码并将其放在系统上安装的任何Web服务器的根目录中。 Web Server是量角器测试运行所必需的。 必须具备NodeJS和NPM。 -
计算机组成原理 学习总结4 指令系统
2020-06-13 22:03:044.1 指令系统的发展和性能要求 4.1.1 指令系统的发展 程序——用于解决实际问题的一系列的指令; 指令——使计算机执行某种操作的命令; 从组成的层次结构来说,计算机的指令可分为如下3类: 微指令:微程序级的命令... -
ARM指令系统
2017-08-19 22:22:24ARM指令系统 3.1 ARM处理器的指令格式 3.1.1 ARM指令集的特点 第3章 ARM指令系统 第3章 ARM指令系统 3.1 ARM处理器的指令格式 3.1.1 ARM指令集的特点 ARM内核属于RISC结构,所以其指令集有着一些独特的... -
汇编语言(1)8086指令系统常用指令总结
2020-09-06 18:15:22汇编语言(1)8086指令系统常用指令总结 一、操作数的寻址方式 选择寻址方式有两条原则:第一实用,第二有效。 1.立即寻址 立即数可以理解为常数,且字长是不确定的,(例如02H,可以为0002H当被输入AX中时)在指令中... -
【Computer Organization笔记02】指令系统、MIPS指令系统简介、THCO MIPS指令系统、THINPAD指令模拟器
2019-11-10 22:20:39计算机指令系统是软件和硬件的接口,本文以模拟器模拟硬件环境,实现汇编语言收尾。 -
特权指令 访管指令 与 用户态和核心态 系统调用
2019-11-05 00:22:19从指令系统角度,在指令系统中存在用于管理硬件和整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令则会被中断出错。所以用户... -
从六大角度理解计算机操作系统
2019-04-06 20:03:51【计算机操作系统】 操作系统的概念 操作系统(Operating System),简称OS OS是计算机系统最基础的系统软件,管理软硬件资源...#从用户角度看,OS管理计算机系统的各种资源,扩充硬件的功能,控制程序的执行 #从人... -
单片机基础:对单片机指令系统中七种寻址方式的理解
2020-07-18 14:37:40轻松掌握单片机指令系统中的几种寻址方式。立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、基址加变址寻址、相对寻址、位寻址。 -
从编译原理的角度看C语言是如何转换成汇编语言的?
2019-09-17 07:31:49大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言所编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令。 以上这些转变是如何发生的就属于大名鼎鼎的... -
AVR单片机指令速查
2021-07-07 11:54:24计算机指令系统是计算机硬件的语言系统,也叫机器语言,它是软件和硬件的主要界面,从系统结构的角度看,它是系统程序员看到的计算机的主要属性。 -
特权指令、访管指令、陷入指令、广义指令--操作系统
2020-09-10 21:09:48○ 从指令系统(指令集)角度定义,在指令系统中拥有用于管理硬件和整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令将发生... -
【Linux从青铜到王者】第一篇:Linux常见指令
2021-05-24 16:24:09文章目录系列文章目录前言一、Linux是什么二、Linux下基本指令1.ls指令2.pwd指令3.cd指令4.touch指令5.mkdir指令6.rmdir指令7.rm指令8.man指令9.echo指令10.cp指令2.读入数据总结 前言 一、Linux是什么 Linux是... -
操作系统之存储管理
2021-06-10 00:55:54“取指令,执行指令”,这是冯诺依曼式计算机的基本原则,进程管理研究的是CPU如何执行指令的问题,而指令得以执行的前提是已装入内存。...然后从实存和虚存两个角度,分别介绍常用的几种存储管理方案。 -
嵌入式系统那些事-文件视角下的arm指令集
2022-03-18 22:04:53本文是文件视角下的arm体系结构的开篇-指令集,本文是文件视角下的arm体系结构的开篇-指令集,在文件视角下,arm体系端到端的文件笔者归结为指令集、汇编文件、elf文件和运行时文件4个不同形态,笔者将一一解读。 -
指令集分类 (CISC,RISC和VLIW等)
2021-07-27 10:01:37复杂指令集计算机(CISC)为了软件编程方便和提高程序的运行速度,硬件工程师采用不断增加可实现复杂功能...精简指令集计算机(RISC)指令系统只包含那些使用频率很高的少量指令.并提供一些必要的指令以支持操作系统和... -
CPU的结构和功能——指令流水及中断系统
2019-01-01 17:29:31取指令,把指令从内存单元中取出 分析指令,对指令的操作码部分进行阶码,分析这条指令要完成什么功能,是指令集中哪一条指令 执行指令,CPU的控制器发出各种操作命令,由这些操作命令控制相应的部件去完成指令... -
从运维的角度看微服务和容器
2016-08-31 08:55:18让我们先从运维的真实场景出发,来看一下单体应用存在的问题。这里先分享两个真实的生产案例: 案例一是某核心业务系统,所有的业务逻辑代码都打包在同一个WAR包里部署,运行了将近几百个同构的实例在虚拟机上。某次... -
linux常用指令
2022-01-23 14:26:38文章目录Linux下基本指令ls指令which指令alias指令ll指令pwd指令cd指令echo指令touch指令stat指令mkdir指令rmdir指令rm 指令man指令cp指令mv指令cat指令tac指令more指令less指令head指令tail指令时间相关指令 ... -
从cpu角度理解PCIe
2018-10-24 10:34:53为什么需要写这篇文章,当我阅读《深入浅出SSD》这篇书籍中PCIe章节时发现,本书籍的侧重点是放在PCIe控制器和PCIe协议上,从CPU角度理解PCIe知识偏少,本文对下面几个知识点做出一些补充。 CPU访问外设寄存器与... -
32位嵌入式CPU中系统控制协处理器的设计
2020-08-14 06:26:19MIPS体系结构中的系统控制协处理器简称CP0,它提供指令正常执行所需的环境,进行异常/中断处理、高速缓存填充、虚实地址...单从硬件的角度而言,系统控制协处理器对指令集的作用就相当于操作系统对应用程序的作用一样。 -
嵌入式系统/ARM技术中的32位嵌入式CPU中系统控制协处理器的设计与实现
2020-12-06 16:09:01单从硬件的角度而言,系统控制协处理器对指令集的作用就相当于操作系统对应用程序的作用一样。 异常处理 CPU运行过程中常常需要中断正常执行的指令流程,跳转去执行某段特殊的指令段,接着再恢复原来的指令... -
计算机指令
2021-05-25 02:09:00从硬件角度来看,CPU就是一个超大规模集成电路,通过电路实现了加法,乘法乃至各种各样的处理逻辑。从软加工程师的角度来讲,CPU就是一个执行各种计算机指令(InstructionCode)的逻辑机器。这里的计算机指令,就好比...