[音乐]
上一讲介绍了计算机中最基本的运算电路,我们知道计算机中的所有运算
都是由相应的运算电路完成的 而这些运算电路是由基本的逻辑门
构成的,那么计算机是如何知道在运算电路中 该执行什么操作,该对什么样的操作数进行运算的呢?
本讲主要介绍高级语言程序中的表达式 运算类指令和运算电路之间的关系
C语言当中支持的基本数据类型
有这样一些,比如说char型,或者是unsigned char型 short型或者unsigned
short型,int型和unsigned int型 或者long型,long long
型,还有指针类型 另外还有一类是浮点操作数
那么这些操作数它的这个长度 可能是一个字节或者是16位,或者是32位,或者64位等等
刚才看到的那些数据类型实际上它要么是
一种变量或者是一种常量,那么这些变量和常量
各种不同的数据类型它可能会出现在表达式当中
这些表达式实际上是通过刚才我们讲的 具有那些数据类型的变量和常量
通过运算符把它表示出来的一种表达式,这种
运算符实际上有多种类型,一种是算术运算符 比如说+-
* /,或者是取余,以及 各种关系运算符,这些关系运算符实际上是进行比较的
比较的时候,比较大小通常是通过做减法,因此它相当于是一种
减运算,也就是说关系运算符 在这个底层实际上是通过做减法来比较大小的
因此它是一种减法运算符,还有一类是按位运算符
还有逻辑运算符,逻辑运算符实际上把整个的一个数据看作是一个值
另外还有扩展和截断,那么扩展和截断实际上它是 没有运算符,但是你强制类型转换的时候有可能会
在前面进行零扩展或者符号扩展,或者把一个长的数据截断成短的数据
这些都是高级语言当中表达式当中出现的数据类型和运算类型
比如说对于一个赋值语句 右边是一个表达式,左边呢是一个变量
这个表达式的值最后要赋给这个变量,这样的一个赋值语句
在机器上到底是怎么实现的呢?任何的这种 高级语言的语句都要变成相应的指令
就是通过若干条指令来实现语句 因此表达式也就是进行某种运算的这样的
语句,它实际上转换成一组运算类的指令
也就是说这个指令序列当中大部分的指令是进行运算的指令
这样的话就可以来实现这个表达式 比如说刚才我们讲的这样的一个表达式
我们任何的表达式最终都转换成一个指令序列 这个表达式转换的指令序列就是有这样两条指令
一条是先计算x右移两位的值 然后再把得到的右移两位的结果再和k相加
比如说我们可以把x分配在一个寄存器里面,ax寄存器里面
然后对这个寄存器的内容呢先进行右移两位,因为这个x
k这些都是带符号数,所以它用的是算术移位方式 完了以后结果放在ax里面
再把ax的内容和k相加,事先我们把k它的值
先分配在bx寄存器里面,我们用这个加法指令就可以实现这个表达式
那么用这样两条指令我们就可以完成右边这个表达式的计算
机器执行这个指令的 时候,实际上计算机是直接执行这个指令的
也就是说控制器对 指令译码以后,根据指令的这个译码的结果
产生相应的控制信号,这个控制信号就会送到 前面我们讲的那些运算电路里面去
去控制运算电路进行相应的运算,比如说移位或者加或者减等等
例如刚才的那两条指令对于算术右移指令
控制器对这条指令译码以后就会送出相应的控制信号
来控制把这个操作数2
和ax的内容送到移位器去,并且控制这个
进行右移,右移的位数是两位 把这个操作数送到控制器,并且把控制信号送过去
对于下面这条指令那么它就控制把ax的内容和bx
的内容送到前面我们讲的补码加减运算器,也叫整数加减运算器当中
控制它做加法运算,这些移位器和 整数的加减运算器实际上我们前面讲过都是由逻辑门电路构成
因为我们可以看到从高级语言的这个表达式
到最终的这个逻辑门电路实际上中间是
通过指令作为媒介的,也就是说高级语言的这个
表达式转换成若干条指令,每条指令
在机器上直接执行硬件,能直接执行这个指令
这个指令的执行最终实际上靠运算电路来执行 在运算电路里面进行运算的
当然控制信号是由控制器发出来的 这些控制器也好,运算电路也好,都是由逻辑门电路构成的
这就是从C语言当中的表达式到逻辑门电路之间的一个转换过程
因此数据的运算我们可以看到高级语言当中涉及到算术运算
而这个算术运算包括整数的算术运算和浮点数的算术运算 还包括按位、
逻辑、 移位、 位扩展、 位截断等等这些运算 这些运算一定是要由相应的指令来实现
因此不管是什么样的处理器,它提供的这个指令集
里面一定要涉及到,要能够进行 算术运算,包括取负操作
符号扩展,加减乘除运算等等,这是带符号整数的运算
还要能够对无符号数进行零扩展啊,加减乘除啊,左移右移这样的运算
逻辑运算也要有相应的指令,比如说与运算指令、 或运算指令
取反、 异或等等这些运算指令,另外还要提供一套浮点数的
加减乘除指令,因为我们的高级语言当中需要对
浮点数进行运算,因此必须要有相应的这个指令 因此我们可以看到高级语言当中涉及的各类运算
实际上最终是转换成相应的指令来实现,因此指令集当中必须提供相应的运算类指令
而这些运算指令当中的运算最终是在
运算电路当中实现的,运算电路当中最基本的电路就是ALU
ALU里面有加减运算器,有与/或/非等等各种逻辑电路
还有通用寄存器,我们刚才可以看到送到运算器去运算的这些操作数
都是来自于通用寄存器的,那么多个通用寄存器就
构成一个通用寄存器组,当然还包括其他的一些部件
包括存放条件码的和标志信息的部件啊
左移、 右移等等其他的一些部件,都是用于进行运算的电路
因此我们可以看到高级语言要能够在机器上执行
它实际上是做了两次转换,一次是
转换成指令,高级语言的表达式转换成指令,然后这个指令在电路上
进行执行,这个就是从高级语言的表达式到门电路之间的转换过程
[音乐] [音乐]