指令系统
一、机器指令
指令系统是计算机硬件的语言系统,也叫机器语言,指机器所具有的全部指令的集合,它是软件和硬件的主要界面,反映了计算机所拥有的基本功能。从系统结构的角度看,它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力,也决定了指令的格式和机器的结构。设计指令系统就是要选择计算机系统中的一些基本操作( 包括操作系统和高级语言中的) 应由硬件实现还是由软件实现,选择某些复杂操作是由一条专用的指令实现, 还是由一串基本指令实现, 然后具体确定指令系统的指令格式、类型、操作以及对操作数的访问方式。
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如:操作码字段+地址码字段,其中操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。
1.指令的一般格式
指令的基本格式如:操作码字段+地址码字段,其中操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。
操作码字段 | 地址码字段 |
---|---|
指明了指令的操作性质及功能 | 给出了操作数或操作数的地址 |
(1)操作码。
- 操作码用来反映该指令所要完成的操作。
- 操作码位数翻反映了某类机器允许的基本操作数量,也就是指令数。
- 操作码长度有固定和可变两种。
扩展操作码技术
- 扩展操作码是一种指令优化技术,即让操作码的长度随地址数的减 少而增加(即扩展)。根据不同的地址指令格式,如三地址、二地址、单地址指令等,操作码的位数可以有不同的选择,从而在满足需要的前提下,有效地缩短了指令长度。
- 作码4位可表示16条指令,由于只有15条,所以还剩余一种状态
1111
,可以做二地址指令的标记。 - 注意这里的三地址、二地址、单地址与下面的地址码划分的有所不同。
(2)地址码
地址码,用来指出该指令的源操作数地址、结果地址、下一条指令的地址(如果我们约定好规则可以不用记录)。这里的地址可以是主存的地址、寄存器地址、IO设备地址。
- 一个地址码字段的长度,就反映了其能覆盖的地址范围。所以我们要想办法加长地址码字段的长度。
- 如果操作码长度固定,指令字长固定,那么如果分开的地址字段数量越多,那么一个字段的长度越短。我们要减少字段数量。
- 这里的N地址指令与前面的有关联,但是又不一样。
指令类型 | 指令内容 | 性能 | 如何优化 |
---|---|---|---|
四地址指令 | 有四个地址字段,分别为第1、2操作数,结果存储位置,下一条指令位置 | 访问存储器四次,如果我们又程序计数器PC的话,下一条指令位置就没有永 | 取消下一指位置的字段 |
三地址指令 | 基本与四字段同 | 还是访问存储器四次,但是由PC控制下一指令 | 每次运算的结果不一定要放在主存里面,还可以放在之前操作数的位置,或者CPU的寄存器里面 |
二地址指令 | 删除了结果存储位置 | 如果存在之前操作数的位置里,4次。放寄存器就3次 | 假定我们之前的运算结果是已经放在了寄存器里面了,我们第一个操作数就可以舍弃 |
单地址指令 | 我们加入了寄存器ACC,上一次计算结果,放里面,对于第一次运算,就是取数放入 | ||
零地址指令 | 指令字中无操作码 | 用于一些不用操作数或者操作数隐含的指令 |
2.指令字长
- 机器字长:计算机进行一次整数运算所能处理的二进制数据的位数。
- 指令字长:机器指令中二进制代码的总位数,指令字长取决于从操作码的长度、操作数地址的长度和操作数地址的个数。不同的指令的字长是不同的。
- 存储字长:一个存储单元存储一串二进制代码,这串二进制代码的位数称为存储字长,存储字长可以是8位、16位、32位等。
二、操作数类型和操作类型
1.操作数类型
地址、数字、字符、逻辑数据等等。
2.数据的存放方式
(1)边界对准
如果我们有一个数据,当其存储的时候跨过了两个机器字,那么读取数据要多次访存,地址的分配也不明确。
数据对齐储存实际就是让数据地址按照其数据类型大小的整数倍进行储存,目的在于使得数据能以最少的次数连续读取。
假如32位的系统读取数据时一个字是32位或者4个字节,当数据储存时,会尽量按照数据类型大小的整数倍进行地址分配。
-
- 比如数据中: - - int为4个字节; - long long是8个字节; - char为1个字节。 - 那么在内存地址分配上: - - int只能放在首地址为0,4,8的位置上; - long long放在首地址为0,8,16的位置上; - char可以放在任意位置上。
当计算机进行读操作时,对于int类型数据只需要一个周期,long long两个周期。但如果按照自然顺序存放,int类型就可能需要两个周期,此时的int类型数据横跨了两个字的储存空间,相当于一个仓库里有若干房间(字),每个房间里有4个按顺序编号(地址)的箱子箱子(字节),每进一次房间相当于一个周期。
当所存数据不足一个字长时,可以加入空白字节填补。
(2)字节序
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
- a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
- b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
- c) 网络字节序
对于低字节低地址和高字节低地址,大白话说来就是,我们是从左往右都这个数字,还是从右往左读。
num_real = 123456
Little-Endian = 1 2 3 4 5 6
Big-Endian = 6 5 4 3 2 1 高位反而存的是我们真实数据中的低位数字
3.操作类型
操作类型 | eg |
---|---|
数据传送 | MOV, LOAD, STORE |
算数逻辑 | 加减乘除 |
移位 | 算术移位,逻辑移位,循环移位 |
IO |
转移
type | |
---|---|
无条件转移 | |
条件转移 | SKP, BRO |
调用与返回 | CALL, RETURN |
陷阱与陷阱指令 | 陷阱是意外的中断,陷阱指令一般为隐指令,CPU自动执行 |
三、寻址方式
寻址的目的,一个是找到现在所需要的数据,一个是找到下一条指令的位置。
1.指令寻址
基本上为顺序寻址和跳跃寻址。顺序寻址依靠PC自增,跳跃寻址就是基本的转跳
2.数据寻址
数据寻址的方式很多,需要再指令字中设立一字段来说明类型。而地址码字段也不一定是真实地址,一般称为形式地址,记做A。
对于真实地址,记作EA。
(1)立即寻址
直接指令本身就带了数据,也就是说,形式地址A中的内容不再是地址,而是直接是操作数。
操作数就在指令中,紧跟在操作码后面,作为指令一部分存放在内存的代码段中,该操作数为立即数,这种寻址方式称为立即寻址方式。数据通常采用补码的形式存放。常用于给寄存器赋初值(作用)
-
①立即数可以送到寄存器、一个存储单元(8位)、两个连续的存储单元(16位)中去;
-
②立即数只能作源操作数,不能作目的操作数;
-
③以A~F打头的数字,前面必须加数字0。
优点:指令已经提供操作数,无需再次访问存储器。提供操作数最快。
缺点
①操作数为指令一部分,不能修改,适用于给某一寄存器或存储单元赋初值等操作。
②指令中A的位数限制了这类指令所表述的立即数的范围。
(2)直接寻址
A中直接存数据的地址。
(3)隐含寻址
不显式给出操作数地址,而是指明在某个寄存器中。
(4)间接寻址
中间会进行一次过渡,A中存的是地址,该地址指向字段内存的是目标的地址。
(5)寄存器寻址(间接)
给的是寄存器的编号,而不是地址单元的编址,寄存器可以存数据,也可以存地址(间接)。
(6)基址和变址寻址
从两者定义来看,感觉没有多大区别。只是寄存器中存放基准地址还是偏移地址。为什么不看成一种呢?我们来详细解释。
基址寻址
- 定义:指令中给出一个寄存器号和一个形式地址,寄存器的内容为基准地址,形式地址是作为偏移量。
基准地址加上偏移量作为操作数的有效地址。 - 基址寻址中的基址寄存器内容通常由操作系统或管理程序确定,程序执行过程中值不可变。其偏移量可变。主要是面向系统的。
基址寻址典型应用是程序重定位。目标程序由操作系统调入内存,用户并不知道放在了内存哪里。用户编程使用的地址实际是逻辑地址,在将来运行时才转换成实际的物理地址。基址寻址方式下,程序重定位时由操作系统给用户分配一个基准地址(在基准寄存器中),在程序执行时就可以映射成物理地址了。 - 而且基准寻址能扩大寻址范围(基址寄存器位数大于形式地址位数)。举个例子:主存16M,基址寄存器24位(不是寄存器地址24位!)。指令中地址段使用16位,2位用来寻址寄存器(假设由4个寄存器,则需两位地址),剩余14位给出位移量,可访问16KB连续存储空间。每次修改基址寄存器的值,那么基址加变址每次可以寻找连续16KB的空间。显著提高寻址性能
变址寻址
- 定义:指令给出一个寄存器号和形式地址,寄存器的内容作为偏移量,形式地址作为基准地址。基准地址加上偏移量得到有效地址。
- 变址寻址是面向用户的,变址寄存器的内容可以由用户进行改变,形式地址不变(直接写在了指令中)。常用于数组。可设定形式地址位数组首址,每次通过改变变址寄存器的值实现数组的操作。
- 也就是可以通过变址的内容修改,使得同一段代码可以访问到不同内容
(7)相对寻址
PC+A
(8)堆栈寻址
堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈是寄存器(或专用寄存器组)中一块特定的按"后进先出(LIFO)"
原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)