在初学C语言编程的时候,有这么一个概念——程序是由指令构成,若干条指令按照一定的顺序排列,来完成某个特定的任务。
我就在想指令到底是什么?
网络上说:“高级语言被翻译成汇编指令,汇编指令又被转换为可执行机器码。”
那么,汇编指令到底是什么?
汇编里的mov,add,sub,到底是什么?
教材里说汇编指令就是机器码,那机器码又是什么?
我们都知道计算机是由硬件电路组成的,而基本的硬件电路,只能完成最简单的功能。
这肯定不能满足需求,于是人们把这些基本的硬件电路组合成复杂的电路,来实现复杂的功能。
——————————————————————————————————————————
假设我们有一块复杂的电路,它只能完成“加”和“减”两个功能,这两个功能是由两个单独的部件实现,加法电路和减法电路。
要驱动电路工作,就必须给它一个电信号,加法的电信号与减法的电信号肯定不同。
因为电路本身没有智慧,如果信号相同,它无法区别到底使用哪一个部件。
这两个不同的信号就能实现两个不同的功能。
要想实现更多的功能,比如乘法,除法,就往它身上上添加新的硬件电路。
最后添加完成的复杂电路,就叫做微体系结构。
回到当初的问题,指令到底是什么?
指令(机器码)就是信号,不同的电信号就能驱动不同的硬件,来实现不同的功能。
许许多多各不相同的指令(机器码),人们给它归纳汇总,就是指令集系统。
———————————————————————————————————————————
指令就是信号说起来蛮简单。
机器码在我们人类看来它就是个二进制数,又怎么变成信号了?
实际上在cpu内部,指令的具体执行还是挺麻烦的。
一条指令通常可以被分成两个部分:操作码 地址码
计算机在执行一条指令的时候,常规步骤如下:
1. 从内存里取出指令;
2. 把该指令放到指令寄存器;
3. cpu内部有一个硬件电路叫做译码器,它就负责把指令寄存器中的指令操作码进行“翻译”,翻译结果交给操作控制器(硬件电路),控制器产生控制信号!
4. 指令寄存器中那条指令的地址码,被送到地址寄存器;
到了第3步,指令到信号的转换才真正完成。
所以硬件才是程序能够运行的基础。
计算机系统结构就是软硬件的接口,人们在这个部分设置一系列的规范,硬件的开发者按照规范去实现硬件。
把规范的每一条指令都用逻辑电路去实现。
值得注意的是,每一条指令都有逻辑电路实现,这句话还可以细分。
有些指令它的逻辑电路属于共用实现,也就是说好几个逻辑电路配合起来完成该指令,这些逻辑电路也可以是另一条指令的组成部分。
有些指令它的逻辑电路属于专用实现,比如x86的mmx或sse扩展指令,每一条mmx或sse指令都对应了专用的硬件电路。
很简单就能想到——指令越多,硬件电路也越多越复杂。
这样上层依赖于指令的高级语言,才能完成各种功能,如果没有底层指令支持,程序是无法运行的。
所以在学习过程中,遇到一条指令,“为什么会有这个指令?”,“为什么指令是这个格式?”
诸如此类的问题,那是因为最初在计算机系统结构部分(分析+评测),被人为规定好的!
先有规范,再去实现硬件!
————————————————
版权声明:本文为CSDN博主「dark_tone」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dark_tone/article/details/52426886