计算机底层——指令

指令是由操作码和地址码组成的。

在之前程序的执行_想搞钱的小陈的博客-CSDN博客提到,load指令将内存中的数据导入寄存器,我们携程了16进制:9x8c000100,拆分为二进制就是

100011           0000                  00000000000000100000000000

指令编码        寄存器R0           内存地址0x100

最左边的6位就是操作码,英文名是OpCode,100011代表load指令;

中间的4位是寄存器的编号,这里代表寄存器R0;

后面的22位代表要存取的地址,也就是0x100

所以我们是把操作码寄存器的编号要读取的地址合并到了一个 32 位的指令中。

我们再来看一条求加法运算的 add 指令,16 进制表示是 0x08048000,换算成二进制就是:

000010              0000                     0001                   0010                   000000000000000     

指令编码        寄存器R0                  寄存器R1             寄存器R2                   未使用  

 最左边的 6 位是指令编码,代表指令 add;

紧接着的 4 位 0000 代表寄存器 R0;

然后再接着的 4 位 0001 代表寄存器 R1;

再接着的 4 位 0010 代表寄存器 R2;

最后剩下的 14 位没有被使用。

 构造指令的过程,叫作指令的编码,通常由编译器完成;解析指令的过程,叫作指令的解码,由 CPU 完成。由此可见 CPU 内部有一个循环:

首先 CPU 通过 PC 指针读取对应内存地址的指令,我们将这个步骤叫作 Fetch,就是获取的意思。

CPU 对指令进行解码,我们将这个部分叫作 Decode。

CPU 执行指令,我们将这个部分叫作 Execution。

CPU 将结果存回寄存器或者将寄存器存入内存,我们将这个步骤叫作 Store。

 上面 4 个步骤,我们叫作 CPU 的指令周期。CPU 的工作就是一个周期接着一个周期,周而复始。

指令的类型

通过上面的例子,你会发现不同类型(不同 OpCode)的指令、参数个数、每个参数的位宽,都不一样。而参数可以是以下这三种类型:

寄存器;

内存地址;

数值(一般是整数和浮点)。

当然,无论是寄存器、内存地址还是数值,它们都是数字。

指令从功能角度来划分,大概有以下 5 类:

1.I/O 类型的指令,比如处理和内存间数据交换的指令 store/load 等;再比如将一个内存地址的数据转移到另一个内存地址的 mov
指令。

2.计算类型的指令,最多只能处理两个寄存器,比如加减乘除、位运算、比较大小等。

3.跳转类型的指令,用处就是修改 PC 指针。比如编程中大家经常会遇到需要条件判断+跳转的逻辑,比如 if-else,swtich-case、函数调用等。

4.信号类型的指令,比如发送中断的指令 trap。

5.闲置 CPU 的指令 nop,一般 CPU 都有这样一条指令,执行后 CPU 会空转一个周期。

指令还有一个分法,就是寻址模式,比如同样是求和指令,可能会有 2 个版本:

1.将两个寄存器的值相加的 add 指令。
2.将一个寄存器和一个整数相加的 addi 指令。

另外,同样是加载内存中的数据到寄存器的 load 指令也有不同的寻址模式:

1.比如直接加载一个内存地址中的数据到寄存器的指令la,叫作直接寻址。
2.直接将一个数值导入寄存器的指令li,叫作寄存器寻址。
3.将一个寄存器中的数值作为地址,然后再去加载这个地址中数据的指令lw,叫作间接寻址。

因此寻址模式是从指令如何获取数据的角度,对指令的一种分类,目的是给编写指令的人更多选择。

了解了指令的类型后,我再强调几个细节问题:

1.关于寻址模式和所有的指令,只要你不是嵌入式开发人员,就不需要记忆,理解即可。
2.不同 CPU 的指令和寄存器名称都不一样,因此这些名称也不需要你记忆。
3.有几个寄存器在所有 CPU 里名字都一样,比如 PC 指针、指令寄存器等。

指令的执行速度

之前我们提到过 CPU 是用石英晶体产生的脉冲转化为时钟信号驱动的,每一次时钟信号高低电平的转换就是一个周期,我们称为时钟周期。CPU 的主频,说的就是时钟信号的频率。比如一个 1GHz 的 CPU,说的是时钟信号的频率是 1G。

到这里你可能会有疑问:是不是每个时钟周期都可以执行一条指令?其实,不是的,多数指令不能在一个时钟周期完成,通常需要 2 个、4 个、6 个时钟周期。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值