5. 编程基础认知

1 5.1 前序

前面的章节我大致介绍了一下计算机的组成结构以及各个部分的作用,从本文开始,我们就正式开始认识编程,带你快速领略编程语言的发展之旅。

2 5.2 机器码

虽然前面我们一直在说,计算机只认识0和1这样的数字、并去执行它,但相信你其实依旧感受的不是特别深。

毕竟CPU作为只接受0和1这样的数字来执行命令的器件,怎么就能够完成如此庞大的计算量呢?

因此我们便常常能看到指令集这个词,它就是CPU所能完成计算的功能集合。

而机器码,便是这些指令集所对应的二进制形式,已经固定在了CPU内部,属于焊死了。

机器码形象点来说,指的就是机器所能识别的编码,大多数时候这是固定写死在CPU内部的,只要你输入相应的编码,那么CPU就会对其进行执行、并将结果输出。

比如,如果我们想要完成一个加法操作,它对应的机器码可能为:

b0 00 
b1 01
01 c3
8a 00
89 00
b8 01 00 00 00
31 db
cd 80

上面便是CPU执行一个加法功能操作所看到的所有指令所对应的机器码,可以看到,我们作为人来说,实际上是很难看懂上面这串机器码是在干什么的。

实际上还会更复杂,这里用了十六进制代替二进制、并且还分行显示各个机器码的执行开始与结束,实际上CPU看到的是上面十六进制转换为二进制、并且全部放在一行中的数据。

比如一个基本的加法操作,对应的机器码实际上是上面的第三行:01 c3

前面的01代表当前执行的是加法操作,而c3则是代表加法操作所需要的两个参数的位置。

虽然这里看起来它只是一个十六进制的数字,但实际上在CPU眼中,它是一串8位的二进制串,通过预先确定的规则(比如前四位是第一个参数的位置,后四位是第二个参数的位置),就能用一个数字表达很多意思,一个8位二进制串最多能表达28=256个信息。

但这还只是基本,另一个复杂的点是,CPU并不是一家独大。

当前世界上的CPU主要分为两类,其一是英特尔,其二是AMD,加上国产CPU目前也在提上进程,种类繁杂,只要CPU的类型不同,那么它们执行同一个操作(比如加法指令)所对应的机器码就不一定相同。

这就意味着,如果你想要写一份通用的程序让其可以放在各种类型电脑上跑起来,那么你还得写多份机器码!

3 5.3 汇编语言

从上面可以看出来,机器码对于人来说是非常不友好的,我们很难看懂那是在干什么。

为了解决这个问题,于是乎就出现了相应的汇编语言,它与机器码是一对一等价的,其唯一的作用就是让我们能够快速看懂、并且能够方便编程。

比如上面那段机器码,其所对应的汇编代码如下:

b0 00         ; mov al, 0
b1 01         ; mov bl, 1
01 c3         ; add al, bl
8a 00         ; mov al, [result]
89 00         ; mov [result], al
b8 01 00 00 00 ; mov eax, 1
31 db         ; xor ebx, ebx
cd 80         ; int 0x80

movmove的简写,也就是移动的意思,add则是加法的意思,此时我们就很容易看出来前面这段代码是在干嘛了。

将数字01移动到某个位置、然后对两个数值进行相加,并将结果存放在了某个位置。

这里的某个位置,实际上指的是一个叫做寄存器的东西,它是CPU用来临时存放数据的地方,能保存的数据量极小,但其速度极快,如果你未来对逆向工程感兴趣,那么你会大量看到、甚至用到它。

有多少机器码,就会有多少相应的汇编指令,它们之间是完全一一对应的。

因此在古老的时候(几十年前),编程便从原本的机器码编程转变为了汇编编程,这极大提高的程序的可阅读性、简化了编程过程。

一段汇编代码可能长下面这样:

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux