00:00
那首先呢,我们今天呢,就开始讲这个第一节课嘛,这个就是一节理论课啊,这这个节课我们主要来了解一些这个基础知识,那首先呢,就是我们这个架构问题啊,就是我们看一下我们现在这六张图,就是一些常见的这个计算机啊,啊这些长得乱七八糟的东西呢,其实严格来说都是计算机啊,就包括我们的这种服务器啊,台式主机啊,笔记本手机啊,这是数莓派这玩意儿呢,是那个路由器啊,相信大家也都认识这种东西啊,这里头大家可能唯一不认识的就是这东西啊,那这些东西呢,我们呢,基本其实呢都可以称之为计算机啊,他们呢,基本的这个架构呢,也类似啊,也类似啊,都包括我们的这个处理器啊,包括我们内存,包括我们硬盘啊这种东西啊,当然有的不是硬盘,有的是闪存啊,这种呢,就有细微差距啊,但是大致上还是相同的,比如说你这个,呃,手机上你肯定也是有处理器啊,也是有这个硬盘的,也是有这个内存的,对不对,大家也都用过啊,当然了这个。
01:01
这个内存呢,在对于这个手机而言呢,它的这个称呼方式呢,呃,可能有点区别啊,就是它存储那个东西呢啊,我们应该称之为硬盘,但实际上而言,大家大部分情况下呢,之为内存啊,然后呢,它真正的内存那部分呢,大家有时候呢,会称之为运存啊,这个有细微差别,但是没什么大的差距啊,那你像底下这两个玩意儿呢,他们呢,也都是类似的东西啊,你像是这个数莓派和这个路由器,那我们这种呢,这种这个大型的这种服务器呢,通常情况下呢,它都是这个基于我们这个叉六和叉六杠六四的一个架构的啊,然后呢,像我们的这个台式机呢和这个笔记本呢,也是啊,就是这种台式机和笔记本呢,相对而言比较少采用这个其他架构啊,大部分情况下都是这个叉不六杠64,当然了,现在呢,有一部分这个这个这种笔记本呢,和这个采用了什么呢?采用了这个ARM架构啊,采用了ARM架构这特指某品牌啊,大家也都知道是什么,然后呢,这个手机呢,它就。
02:01
就是这个基本就是以ARM为主流啊,就是很少见到其他东西啊,那你像是这个数莓派呢,它也是这个ARM架构的啊,但是这种单片开发,单单这种单片机开发版之类的东西,不偏不全是这个ARM架构啊,它这个mes架构也很多啊,你像是路由器里头的芯片呢,大部分都是这个mes架构的,那你像这个ARM架构的单片机呢,用在什么上比较多呢?你像是这个啊,我们的这什么冰箱啊,空调啊这种东西啊,你比较高端的那种带个显示器那种啊,一般情况下都是ARM的,你像路由器这种东西呢,其实以这个MS为主啊,MS为主那这些东西呢,都是这个我们的计算机,但是他们呢,因为CPU的缘故啊,他们的架构是不同的,那架构不同的,也就代表着他们的这个汇编语言是不同的,汇编语言之所以不同的,是因为他们能处理的指令集是不同的啊,这个是这个他们的这个细微差别之处啊,就是说各个东西之间啊,他们还是有一定差距的啊,比如说你要是这个研究咱们PC平台啊,那你肯定是需要学什么差别六杠64的一个汇编,那你要学。
03:01
这个安卓或者iOS啊,那肯定是ARM对不对,ARM啊,当然你这个如果你学安卓的话,也不单是ARM,那后边还有一些类似于smile啊,还有一些这个其他东西啊,那你像是如果要学习我们的这个智能硬件啊,这种东西啊,那你就可能是ARM和S你都需要学啊,有时候可能你连这个叉八六也要学,因为它有些也有些时候呢,它比较杂啊,你像是这个呃,智能硬件它有时候会给你搞一个web啊,Web放在它的固件上啊,它这个东西,它把那个超级系统做成一个固件啊,然后在固件上,然后呢,这个这里边就有web了,然后呢,你除了web之外呢,它这个固件里的这个东西呢,才根据CPU的不同,有可能是这个的,有可能是ARM的,所以说呢,这个还有区别啊,所说呢,学的东西比较多啊,但是咱们现在呢,学的这咱们现在这课呢,学的是的一个汇编啊,所以说呢,其他东西呢,你暂时不用在乎。然后我们再往下看一下啊,就是我们首先呢,我们了解一下计算机呢,为什么会使用这个二进制啊,之所以还产生二进制呢,主要是为了方便啊,因为电呢这个东西呢,包括电路啊,它其实就两种状态,一种是开,一种是关啊电路开呢就是零啊,电路关呢就是一啊,所以说呢,就可以完美的用它来表示二进制,因为二进制就两种状态,零和一,那电路的开和关刚刚好能够表表达出这个东西啊,所以说呢,就采用了一个二进制,然后下边这个东西呢,你可以看到啊,它这有一个这个图啊,就是什么呢?就是我们这有一个值一,这有一个值二啊,中间呢是一个加法,然后呢,这边有一个结果,那什么意思呢?它这每一条线啊,都代表着一个电路啊,都代表着一个电路。
04:41
那我们这个值一呢,就是有什么呢?有八个电路啊,八个电路啊,那值二呢,也有八个电路啊,它输出的结果呢,也是这个八个电路啊,那中间呢,就是它的这个运算方式啊,那我们这里边呢,它是怎么运算的呢?首先呢,我们这儿有一个值一啊,有一个值二,它的每个能输入八条电路代表着什么呢?代表着它就拥有一个八位的一个值,那我们就可以看一下我们这个计算机啊,我们调到这个程序这边,那八位呢,实际上呢,就是这么多啊。
05:13
这么多255看到没啊,那我们可以从这直接选一个这个。啊贝塔啊,这个就就是八位啊,这个贝塔就是八位啊,这个呢,就是我们能形容最长位,为什么刚才还是二五,现在就变成负一了呢,这里边呢,就是存在一个这个叫做符号位的东西啊,这个东西呢,我们之后再学啊,现在呢,我们先看电路,那也就是说呢,我们在这边呢,值一呢,可以输入一个八位的一个数,然后呢,值二也可以输入一个八位的数,它的大小呢,就是在二五啊,然后呢,二五以内啊,二五以内啊,然后呢,如果说它是有符号的,那就是这个负的127到正的128之间啊,如果是这个无符号的呢,就是零到25啊就这么一个计算方式啊,然后两条电路啊,不是两条电路去了啊,两个八位的值啊,在这儿经过这一个一个运算,然后再通过这一个这个八条线啊,八条电路啊,输出一个结果啊,这就是最基本的一个八位的一个电路运算。
06:06
那么这个电路运算呢,它存在一个问题就是什么呢?就是你从输入这输入一个东西,然后经过运算,它输出了啊,它这里一闪而过,啥也没有留下啊,并没有得没并没有任何位置可以留存它的结果啊,所以说呢,这个东西是比较扯淡的啊,那这个时候呢,我们就引入了一个叫做这个触发器的一个东西啊,那这个触发器是干什么的呢?触发器具有一个开关啊,它这有一个锁存啊,那我们这个时候呢,输入一个值啊,那么我们就可以干嘛了呢?我们就可以把它的第一个值放到锁存里,然后呢,再把第二个值拿进来啊,然后呢,再干点其他事情啊,那么我们有了这个锁存之后呢,我们就可以出现了一个新的概念,叫什么呢?叫寄存器的概念,什么叫寄存器啊?寄存器其实就是多个触发器的一个堆叠啊,多个触发器的一个堆叠啊,你比如说我现在是一个这个八位的一个寄存器,那么我这个八位的这个寄存器实际上就是八个触发器啊,八个触发器啊。
07:07
那八个触发器呢,就具备这个这个这个存储八位所存的这么一个能力啊,也就是说我这个八个电路啊,每一个电路里就对应一个触发器,每一个触发器能存一位值啊,那这个时候我这个寄存器里就能存八位的一个值,也就是说我现在就具备了一个什么呢?一个能够存储八位值的这么一个硬件啊,这么一个硬件啊,首先我们要明确寄存器是硬件啊,然后呢,我们知道有这么一个东西之后呢,我们就可以使用它来进行一个四四折运算了,什么意思呢?比如说我在这边输入啊,然后呢,我在可以干嘛呢?我在第一次输入的时候,我把这个把这个八位的值我存到寄存器里啊,这是不是没有问题,那我把这个就第一位的第一次输入的值存到寄存器之后,我可以输入第二次的值,那么第二次的值输入之后,我在这里啊,有一个这个算法啊,有一个算法四个运算,我就可以进行加减乘除的操作啊,用我本次的值和计算器的值进行运算,然后运算完成之后再进行输出啊也可以把。
08:07
输出的值再次放进器里进行寄存啊,这个就是一个啊,拥有了什么呢?拥有了运算能力的一个东西啊,但在之前呢,它是没有这个能力的啊,因为这个东西直接就啊啪啊就没了啊。那我们说完这个东西之后呢,我们来再来了解一下啊,我们已经了解了寄存器的一个本质啊,那这个东西呢,大家一定要记住寄存器这个个概念啊,它是多个触发器的一个堆叠啊,我们之后呢,在这个我们汇编的一个学习过程中啊,我们会大量的使用寄存器,那么首先我们在这里呢,我们再看这个玩意儿啊,这个东西很漂亮对不对啊,就是我们这个台式机中的一种,这个内存条啊,内存条啊,很明显这是一个带马甲的马甲条啊,那我们把这个寄存器这个东西啊,不是寄存器啊,这内存条这个东西啊,大家呢,可能多多少少都见过啊,那这个东西呢,我们现在呢,为什么要看的呢?首先我们要了解一个东西,我们寄存机的内存啊,内存是如何管理的啊,我们是要了解这个东西,而不是给为了大家看一下内存条好不好看啊,那我们首先要了解的是什么呢?就是我们的内存这个东西呢,是由这个内存颗粒而组成的啊,当然这是物理形态上的组成,那我们在这个真正的使用的时候,它是什么形态的呢?首先我们这个呃呃,肯定是有一块内存的,对不对啊,那我们比如说我这个。
09:20
就内存条我是多大的呢?比如说我说小一点,我就1KB的一个内存条啊,当然现在肯定是没有这么小的内存条啊,当年可能也没出现过啊,那我就说我这里是一个1KB的一个内存条,那么这个时候,那我是不是就有一个地址了,那这个地址是多长呢?啊,就看你内存条有多大嘛,对不对啊,你这个内存条1KB,那我肯定就是能存储这个EKB大小的这么一个地址对不对,从零到1KB啊,就这么大,那么我们这个地址呢,从这个零到N表示的就是这个内存的一个总大小啊,那但是这个东西物这个是这个大小是取决于什么呢?是取决你物理的大小,就是你这个内存颗粒啊,能表现多大,它这就有多大啊,但是是它这个东西呢,不是说我们这个系统用的时候也是这么用啊,它是怎么回事儿呢?我们就要了解一个叫地址线的一个东西啊,那首先呢,比如说我们是以一个八位的这个来说啊,八位的地址线啊,那八位的地址线它能存储多长呢?它就能存储八位对不对啊,都说的是八位地址线了,其实就是什么。
10:20
就是八根电路啊,这八根电路能传八个八位值啊,就是像我们刚才这个看的啊,这个啊,就是八位这个值,也就是说这个我二进制情况下,八个一啊,或者八个零啊,或者八个一和零混杂啊,就这么一个东西,那么这种情况下呢,我的地址能取的最大长度呢,就是这么长啊,你再长取不过去了啊,再长取不过去了啊,这是我能我的地址线决定了我能取的地址范围啊,我有八根线,我最大就能只能取到八个一啊,最大也只能取到八个一啊,再长我取不了了啊,我没那么长了,你内存有多大跟我没有关系,我只能取到这儿啊,从零到八个一啊,剩下的跟我没有关系了,那些东西我取不到的就当它不存在啊,这是地址线的功能,那么我们控制线是干什么呢?控制线就是说我们在操作内存的时候,它有两种状态,一种状态呢叫做读,一种状态叫做写,那么这时候控制线呢,它就两种状态了,就是开和关,开关分别。
11:20
代表着读和写啊,所以说呢,这个控制线决定了你要读还是要写,那么读和写,写哪读哪呢,就是地址线啊,就是地址线的位置上啊,决定在这个地址线当前表示这个地址上读还是写,然后还有一根线呢,就是还有一一类线叫什么呢?叫数据线啊,数据线啊来决定啊如何传输数据啊,就是什么意思呢?我们现在比如说我现在有一个在这个123这个位置上啊,123这个位置上,我有一个什么呢?有一个这个值。啊,应该说我这儿说的准确一点,就是地址123这个位置上有一个值,那这个值呢,我现在要读它啊,要读它,然后呢,我现在呢要就开始读对不对啊,那怎么怎么就怎么一个状态呢?就首先我们现在呢地址线啊,地址线的值肯定就是123对不对啊,因为我现在呢要去123这读,然后呢,我现在呢,我的控制线啊,控制线是什么状态呢?是一个读的状态啊,是一个读的状态,然后再由数据线啊,数据线去哪呢?去123这个地址上,把它上边存储的值啊值给它取出来啊,这个就是他们三个东西配合起来啊,应用的一个过程啊,就是我们的啊地址控制线和数据线啊。
12:40
好,那么这三根线有没有人还有什么问题啊,如果没有问题,我们接着往下看啊。好,那么没有问题,我们接着往下看啊,我们了解了这三根线之后呢,我们再来了解一下指令的概念。这个令们编,那么首先我们C它只认零和一啊,这个取决于电路,我们只认零和一,那么这个也就代表着我们的所有程序啊,包括我们现在的这个看到的这个word啊,还是你玩的3A大作游戏,网络游戏,还是说你要用的一些其他的编程软件studio,还是甚至于告你想用的什么ID序啊,那么我们要写程序的情况下,我们直接用零一来写,是不是就有点过分了啊,那么这个时候呢,就引入了一个概念,就是我们的汇编语言,汇编语言呢,就是这个指令的问题了啊,那这个指令翻译的问题了啊,但是我们啊,在这个了解汇编语言之前,我们先了解一下它的。
14:00
指令啊,它是怎么工作的啊,然后我们再了解汇编是怎么把它翻译过去的。首先啊,我们来看啊,就是我比如说我们现在呢,有一个0001,后边有一个1234啊,按照八位来说,那我现在呢,来给它定义一个这个功能啊,就是这些东西都是我自己定义的啊,它不是现实中的指令啊,比如说我现在我首先有一个001啊,那这个001的东这个功能是什么呢?我就给这个功能号取一个功能,就是读取内存,读取内存之后呢,我这个1234是什么呢?是它的参数啊,是它的参数或者说啊,我按我们汇编语言的话来说,它叫操作数啊,那这个操作数是干嘛的呢?我定义它为地址,那么现在呢,我这个0011234代表的意思就是读取内存1234的内存到寄存器中啊,为什么是到寄存器中,我规定的,我说零一是读取到寄存器中,它就是读取到寄存器中,那这个我是谁是CPCP他们根据他们的定这件事,那么这这个指如何去查询呢?啊,就是他们这个白皮。
15:06
比如说啊,你英特尔有英特尔的白皮书,AMAM白皮书啊,当们基本都是基于这个四架构的啊,也是这个叉六四,也叫AMD64啊,是基于这个架构的,但是其他的一些平台呢,它不一定是这样的,比如说ARM啊,它有ARM的一个白皮书,64有M64的白皮书啊,这个是有区别的啊,所以说呢,这个呢,不能一概而论啊,就是说不能说所有的这个东西指令都是一样的,这个你要根据它CPU厂商啊来决定啊,它到底是怎么样的,怎么翻译的,比如说呢,我这呢,就有一个这个英特尔的一个手册。这个玩意儿里头啊,就是想解了这个CP啊,到底都是怎么一回事啊,比如说啊,他会告诉你啊,我现在看的呢,就是它的硬件器,不是硬件调试器啊,是怎么样的啊,每一个啊,每一个位它是干什么的,每一个这个存器里有多少位啊根据这个来的,那么我们这个东西呢,就是CP啊,是以根据的这个行器啊,你不知道他干什么的,甚至你不知道他某一位是干什么的啊,你就可以来此查询啊,这个是它的一个功能啊,那比如说我现在呢,我又定义了一个功能啊,我就是CPU厂商了啊,现在我定义第二功能啊,我0002,我现在要读一个指令啊,那这个指令将器的内容读取到内存1234中,那你现在就又问了啊,我为什么是这个0021234,就是把寄存器的内容写入到我的这个内存1234中呢,还是那句话,我规定的我白皮书,我CPU,我的指令怎么翻译这是。
16:47
我的问题啊,我想怎么弄就怎么弄,对不对啊,那现现在这个呢,就是一条现实中的这个叉六的一个指令,就是1919是什么啊,Jump啊,就是跳转,那后边根据的跟着的呢,就是它的一个操作数啊,12345678嘛,对不对啊,那这个意思就是什么呢?是到12345678这个地址上,但是这个jump呢,它也是有一些这个呃详细说明的啊,这个可以来看这个后边的课,也可以来看这个白皮书里的内容啊,就是说他的跳啊,不是真的就是跳到12345678掌,还有很多的情况,比如说是这个呃,短跳啊远跳啊,还是说是我这是这个跳到相对地址啊这种啊,这个是需要计算的啊啊,它不是说这个真的占吧,就占不到哪儿啊,然后呢,后边呢,我们再来看一下,这个是一个处理器的一个雏形啊,基本处理器呢,就是这样的,首先呢,它有一个运算器啊,相当于我们现在的CPU处理器的一个东西,后边跟的是什么呢?这些东西呢,都是硬件啊,硬件的数据器这个。
17:47
数据寄存器啊,然后除了数据寄存器之外呢,还有这个指令指针寄存器啊,指令指针寄存器是什么意思呢?就相当于我们这个呃,马上要执行的下一条指令啊,要执行的下一条指令啊,然后呢,这个地址线呢,我们在上边呢也说过了啊,在这个位置上我们说过地址线呢,就是取,就决定了你的一个取指范围啊,能访问到哪儿,你八根地址线,你就只能访问到八根地址线的一个地址上,多余的呢,你其实是看不到的,即使它的物理颗粒呢,是超过你地址线的取指范围的,但是你还是看不到它啊,这个就是地址线啊,然后呢,控制线啊,决定它读取啊还是写读写啊,决定它是读是写,根据开关来决定的,然后呢,数据线呢是什么呢?数据线呢,就是你根据地址线的内地址,然后去这个内存上去读取数据,或者说去写数据啊啊,然后这个这个一个功能啊,然后这边呢,是我们的内存啊,我们现在呢,是一个八八比特的一个内存啊,这个呢,就是一个最简单最简单的一个处理器处理的一个雏形啊,一个雏形啊,因为我们现在只有一个运作。
18:47
合几个数据处理器啊,要指定指定器,那么这个呢,是比较单纯的一个八位的一个雏形啊,后边呢,我们呢,要学习的这个汇编呢,实际上是包括这个16位,32位和64位的啊。
19:00
然后呢,我们说完部分之后呢,我们来说下一部分啊。今天讲啥讲汇编啊呃,我们再来说一下这个处理器的一个发展史啊,就是首先呢,我们1971年的时候呢,英特尔呢,推出了世界上第一款这个微处理器啊,4004,它包含了一个这个2300个晶体管的一个四位的一个CPU啊,你可以看到啊,刚咱们刚才其实说这个八位的已经相对新鲜先进了,它最开始呢,它第一个是这个四位CPU啊,然后在七八年的时候呢,英特尔公司呢,首次生产出了16位的这个微力处理器啊,就是这个I8086,同时呢,还与之这个相配合的那个数学这个协作处理器啊,叫做8087啊,这个年代的这个处理器呢,相对而言呢,还是比较单纯的啊,甚至里边呢,还有些什么这个浮点均衡器之类的乱七八糟东西还没有出现啊,还没有出现,然后呢,在后边呢,在878年的时候,英特尔呢,就出现了具有这个16位数据通道啊,内存寻址能力为1EM啊,这个数内存址能力为emb就代表什么呢?代表是它地址,地址总线的数量上去了啊,地址总线的数量上去了啊当。
20:06
今年它可能它的这个内存颗粒啊,可能是够用的,但是它的寻址能力是不够用的啊,因为这个取决于什么呢?取决于它的地质线不够用,然后呢,这个最大的运行速度啊,就是这个8M啊,赫兹的一个8086,然后呢,根据外侧的需求啊,推出了这个外部总线,这个为这个八位的8088啊,然后呢,就有了这个IBM的一个在七九年的时候呢,就出现了这个8088片啊,它呢是第一块成功用于个人电脑的CPU啊,它呢属于这个16的一个微处理器,但是这个时候它的晶体管数量就已经达到了29000个啊,这与刚出现的两千三个2300个相比呢,已经是一个非常大的一个进展了啊,然后呢,它的时均频率呢,就已经达到了这个四点C7M赫兹啊,然后地值总线呢,已经达到了20位啊,注意啊,这个20位是一个需要记住的一个东西啊,它的址范围呢啊,也只是这个em MB啊,这个是年代年代的一个制约啊,然后在八一年的时候呢,8088芯片呢,就用于了这个MMBM的一个PG中啊。
21:06
开启了一个全新的一个危机时代啊,为什么叫危机时代呢?这个其实就是有点意思啊,就是说呢,在我们这个计算机刚刚发展起来的时候,那个玩意儿超级大啊,就是超级大,你可以看到跟小屋似的啊,那么就是为什么我们现在比如说程序的一些这个异常叫做bug啊,其实这个bug最开始指虫子,为什么会是指虫子呢?因为当初那个问题出在哪儿呢?出在于那个超大的计算机里进了个虫啊,所以说呢,它叫bug啊啊,这个就是一个小幽默啊,这个无所谓啊,然后呢,这个八二年的时候呢,这个英特尔呢,就推出了我们的一个80286的一个芯片啊,它比这个8086和8088呢,都有一个较大的一个发展啊,虽然说它仍然是这个16位的架构啊,但是里边呢,已经有了13.4万个晶体管啊,这个时候我们再往回看啊,我们最开始的时候,它就说有2300个晶体管啊,它已经发展到这个地步了啊,已经13.4万个了,然后呢,时钟频率呢,就最开始的6M赫兹啊,已经变成了现在的这个20M赫兹啊这个哎,这个赫兹数其实你们可能没什么概念,你打开你自己的CPU的一个界面来看一下啊。
22:06
你看一下,你现在呢,最低最低啊也得是一点几G赫兹对不对啊,当时是M赫兹啊,它是已经是一个单位级的一个变化了,然后到这个八九年的时候呢,八零四百六就出现了啊,它呢晶体管数量达到120万个啊,这个跟这个2300个比啊,它就已经翻了不少多少倍了啊,并且呢,在一个食龙猪周期之内可以执行两条指令,零四年啊,这个是已经近现代了,奔四啊,就已经这个占据了这个市场的一个主流地位啊,我也是在这个年头的时候,大概开始玩电脑啊,那时候像什么这个我记得零四年应该是半条命吧,然后反正那时候那那时候电脑反正还挺贵的啊,然后在学校也有这个计算机课啊,那时候叫微机课啊,就上课的时候还带鞋套的,你知道吧,然后呢,我们这个零六年啊,这个MD的一个速零六十六十四乘二的一个处理器啊,就开始出现了啊,然后呢,零七年酷睿四核,零八年英特尔诞生的这个720820,然后呢,I3I5在一零年的时候诞生了啊,你看到这儿的时候,是不是有种这个时空穿越的。
23:06
感觉啊,就是我们现在呢,好像说这个I3I5I7I9啊,都已经是很稀松平常的了,但是实际上你不知道它只诞生了十几年啊,只诞生了十几年啊,这就是我们这个现在的生活的一个发展啊,它发展非常快啊,然后呢,在这个幺零年这个九月的时候啊,我们这个MD6核就已经开始供应了啊,然后一年的时候啊,这个980啊,I7980处理器就退市了,然后呢,英特尔在这儿就是发布了这个新的架构,然后一五年呢,就又发布了一代架构啊,这个架构实际上挺有意思的,这这这一代的架构是可以做那个硬件调硬件调试器的啊啊,因为它的那个六代处理器呢,是内置的一个东西啊,但是现在呢,你可能也买不到了,所以说无所谓啊。那我们呢,最开始的这个编程形式呢,是这个我们的这个开关打孔啊,输入设备啊,就是确实0101嘛,你就打孔就完了嘛,有孔没孔就代表着是零是一嘛,所以说呢,就进行了一个这个编程了一个套路,然后呢,我们汇编语言就出现了,刚才我们说指令啊,现在指令我们终于可以翻译成人能看懂的东西了啊,就是我们刚才无论是二进制的还是16进制的啊,就是我们刚才看那个玩意儿,实上是16进制的啊,这个都是二,这个这是十进制的啊,这是我乱写的,这个一九呢,实际上是16进制啊,我们还没学进制不重要啊,你就知道,比如说我们日常中啊,一到十就是零到十,零到九它就是十进制啊,然后这个零和一,它就是二进制啊,零到七就是八进制啊,然后那个这个就代表什么呢?就是它没有几,它就是几进制啊,你看零一它没有二,它就二进制,零这个零到七没有八,它就八进制啊,零到九没有十,它就十进制,为什么说它是这个零到九呢?那个幺零它实际上是进位啊,那个幺零不是十啊,然后呢,零到F它就。
24:53
六进制什么意思呢?0123456789ABCDF啊呃,就是这个意思啊,那这个我们现在呢,在这边看到的呢,首先呢,这个是一个调试器的一个截图啊,我们后边呢,会大量使用的一个调试器啊,这个东西前边呢,这是地址,中间呢是这个指令,后边这个东西呢,就是我们的一个汇编指令啊,那这个东西呢,这个东西的出现呢,其实就大大提高了我们这个程序人员的一个编程效率啊,比如说我们现在呢,前面是一个这个B8,然后零五,后边都是这个零零啊,那它翻译出来就是什么呢?就是5EX5啊,那其实这个时候我们就可以知道啊,我们这个里边的指令啊,这边指令是什么啊,首先是B8是指令。
25:35
然后呢,这个零五是什么?是操作数,那我们分析一下它的功能是什么,它这个木ES5的意思是什么呢?是把五放到存器E里,EA首先呢,我们要知道它是一个32的啊,32的器,那你也可以理解为它是有32个电路的啊,这个触32个触发器的啊,这个存储器啊,啊你可以这么理理解啊,当然这个不准确啊,说的不准确啊,但是你可以这么理解啊,那我们这个B8指令啊,他做了这件事啊,就是把这个零五能够放到这个E器里,那也就是说是说明什么呢?这个B8是什么呢?是将啊将操作数啊放入啊方操作数的值啊,不是地址的值放入啊,这个EAX寄存器啊,它是这个功能啊,那为什么B8是这个功能呢?你可以看到底下啊,它这有一个什么呢?有一个BB啊BB啊零。
26:35
啊,它的功能是E就是E,我们根据的经验,而我们现在了,我B个个相是,但是这个八和呢,就是了BBE这个E03C,它什呢,对EE加,那你03C3本身你看得出来是这个功能,但是它就是这个功能什么呢?因为根据。
27:35
就是说你两个不同的这个汇编引擎,反汇编引擎啊,他们东西的可能翻译出来的是不一样的,但是大致功能是一样的,比如说啊,我这个汇编引反汇编引擎啊,我翻译出来的是一个GC,那边记两边都是跳转啊,功能相似啊,但是啊,他们就是翻译出来的东西不一样,这是因为什么呢?这是因为作者在翻译的时候,在写的时候啊,他们写的这个就不一样啊,就是根据这个指令集翻译的出来的东西不一样啊,那这个呢,就是我们汇编语言的一个概念啊,其实呢,他这个汇编语言呢,就是根据啊,根据我们的指令啊,把它译成我们能能够理解的东西啊,那你像这个木,那其实就是这个什么呢?就是B805啊,那它就是一个就是一一对应的硬编码啊,它可以把这个东西呢,直接的给变成这个指令啊,直接变成指令,它跟高级语言不一样啊,你比如说我在这个高级语言里,我写一个东西啊,那他可能经过层层转换啊,才会变成这个我们真正的东西,那我们这个汇编不是啊,汇编呢,是和我们指令一一对应的。
28:35
啊是一一对应的,那我们一个汇编程序的执行呢,就是什么呢?首先你写的汇编代码,就是我们右侧这种啊,带绿带红的这种,带蓝的带绿带黑的这种啊这种是什么呢?这种就是汇编指令啊,你你自己也可以写这种指令啊,写汇编代码,然后呢,进行汇编程序,汇编程序之后呢,处理器呢,就把这不是编译器呢,就把它呢,或者说叫汇编器啊,汇编器呢,就把它们变成处理器可以识别的这种0101之类的东西啊,然后就变成二进制了啊,然后呢,这个处理器就可以正确的去执行它了,当然了啊,这是最简单的一个过程啊,它其实这种正常的过程呢,不止这么简单啊,比如说我们在这个Windows下啊,它这个东西汇编出来的东西呢,要符合我们Windows的一个可执行程序的一个格式,就是它的一个PE格式啊,要符合它的格式要求,然后呢,才能进行一个处理器执行。
29:22
呃,因为什么,因为你在这个处理器之前呢,在这个执行之之外呢,它中间还挂了一层叫操作系统啊,操作系统认识你一个程序,它才帮你啊去这个执行啊,他去比如说我这个P里边,我有一个执行的位置叫做这个代码端啊,那如果说你不符合Windows操作系统的一个要求,或者不符不符合李大的操作系统的一个要求,那这个时候他就没办法去帮你搞这个东西啊,对不对啊,他就直接执行不起来了啊,因为它要求你有一定格式的需求,接着呢,我们来说一下啊,16位的一个处理器的一个通用寄存器啊呃,这个通用寄存器呢,就是我们刚才说的这个数据寄存器啊,当然了,这里头有些东西呢,是具备这个特殊功能的啊,这个我们后续再学,我们现在只说它这个通用均行器这么一个概念啊,就是其实它理论上的通用均行器呢,就是你可以用来这个保存各种各样的东西随便用啊,但是实际上它里边有一些东西呢,是有特殊功能的,那你像是真正随便用的一般就是这个AX和BX啊,然后呢,这个CXDX呢,有时候都会有一些其他的作用,那这个呢,这个16位的一个器啊。
30:23
就知道它是有16个触发器的什么呀,它16个触发器的一个存储单位,然后呢,它里边呢,还可以切分啊,当然了这个八个啊,八个16位的通用均器只有四个可以分低,那你像A这个A呢,就是AX,那这个H呢是high是low啊就是什么呢,高位和低位的一个区别啊,它每个里边就是八个触发器啊,八个触发器可以保存一个八位的一个值啊,那一共加起来呢,AX呢,可以保存16个触发器16位的一个值,那每个这个八位的呢,就保存八位啊这个这个意思,那你像这个as都是这么一个套啊,但是呢,这个S和这个BP不是这样的,他们呢,并不能切分出八和这个八位啊,而是什么呢?而是直接是一状,那像是S和BP们是的。
31:23
一个作用啊,你比如说这个I和Di,通常呢,用于这个字符串操作,它呢,就是这个原字符串和目的字符串的一个功能,那你像是SP和BP呢,那就是什么呢?就是战啊,这个战的这个概念呢,我们还没有这个学到,但是你现在知道一下他们俩的特殊功能,就是一个是指针,一个是战敌指针啊,他们是这个功能,好,那说完这个东西之后呢,我们再说一下这个字节序的一个问题啊,什么叫字节序呢?就是说我们在内存里存储一个值的时候啊,那么他们呢,实际上是按一定顺序来排列的,你比如说啊,比如说我现在呢,有一个值。我这个值呢,就是上面写的这个啊,12345678,那如果说它是这么存储的啊,就是12345678,那这种正常的情况下,它是什么呀?它就是大端续啊,大端或者说是网络续,那大端续那如果说是像我们这种啊普通的这种计算机啊,英特尔这种普通CPU啊,它呢,就是在处理的时候是什么,它是小的小什么状态呢?是87654321么?不是啊,是以这个两分两分割是什么呢?它小段是78563412这么存,而不是是什么呢?而不是87654321啊这个需要注意一下啊,说要注意一下。
32:38
这是大断续小断序的一个区别,然后呢,再说一下断的一个区别啊。我们这个段啊,首先呢,我们来看一下啊,从零到N的大概意思呢,就是我们的内存中的这个地址啊,从零到N啊,然后中间有个S啊,它是一个分割,那首先呢,你在零的位置上,比如说啊,比如说这个不代表现实啊,只比如说啊,我们这有一个指令点base啊,它是什么代码段的一个基址啊,然后呢,后边的这个位置上的存储的指令呢,都根据它基址来寻找,比如说啊,这个是这个base斯加一,Base斯加二,Base加三,Base加四,Base加五啊这样找到一条条的指令啊。
33:16
那这个东西呢,就是什么呢?就是比如说我们这儿啊,我这有一条当前要执行的指令啊,就执行这个四啊,那我下一条指令指令啊,要求行指令是哪呢?一般情况下啊,如果说它下一条执行的指令就是你当前的位置加上你的指令长度,什么叫当前的位置加上你的指令长度啊,比如说我们回来啊,我们看这儿,我们当前的位置是76962B FC啊,那这个情况下,我的指令长度是B805000000,那我的指令长度是五啊,然后那么这个时候我一条是我在96201,这是为什么呢?是因为这是上一个地址加五,然后到这了啊,这个是这个下一条是的,这个I也就指指也就一条行的指令啊,所以说呢,这个需要注意是什么呢?就是它的下一条指令是当前条指令地址加当前指令长度啊来计算出来的,另。
34:16
再需要注意一点是什么呢?就是在六的情况下啊,我们的这个贝啊,它有一定特殊性的,就是说因为什么呢?因为我们的CS质是地址地址办呢他了一呢,把他的这个。地这个基址啊,直接除个十,为什么呢?因为它有一个规定啊,这是他自己规定的,它的这个它这个地址必须是以零为结尾的,才能作为一个断地址,所以说呢啊,你在这个用的时候呢,再把断段的地址乘以十就给它加回来,因为它结尾是零,所以你乘十除十完全不影响它的这个存储精度啊,所以说呢,就干嘛呢,就就给它这个除以直接除以十了啊用来干嘛呢?用来保存足够的地值的空间,因为什么呢?因为它这个16位的这个16个触发器保存不了20根地址线的一个地址啊,这是它的一个原因啊,所以它会这么来来来用啊,就是什么呢?就是我们的这个CS base加上over啊,加上off。
35:23
然后再说数据啊,数据段的方式类似啊,就是我们的数据段机址啊,乘以十,然后再加上偏移地址,但是需要注意点什么呢?我们这个十啊,都是这个16进制的十,16进制的十呢,实际上而言呢,在我们的这个呃,写错了啊,16进制的十啊,不是16啊。他在十进之中呢,就是16,所以说呢,有些书的书上会写什么呢?会写它的段啊,实际上是除以16或者说乘以16啊,再去存指啊,这个没有错误啊,没有错误啊,这个是因为什么呢?因为制的区别所以导致的啊,另外需要注意点什么呢?就是我们16位的情况下啊,16位的情情情况下啊,它是处于一种叫做实模式的状态下,所以说呢,它这个里边呢啊,我们的段啊是什么呢?是真的保存了一个地址的,但是你当这个进入到32位啊保护模式之后,它的段啊,这个里边保存的就不是你这个东西了啊,就不是这个东西了啊,它是保存了什么呢?保存了所谓的段选择子。
36:25
那断选择子呢,它是干嘛呢,它是指定你去一个表里边啊,这个表是什么,我就先不跟你说了啊,说了你也懵啊,你就知道它有个表,一个table去这个这个断选择子呢,去拆解之后,它能产生一些信息啊,然后呢,这个信息里头呢,就有你的这个访问权限,你的索引,你这个索引的作用就干嘛呢,就去找这个你的表里边的一个位置啊,在哪个位置上有你的段描述符啊,然后呢,这个段描述符呢,又能拆解出好多好多的信息啊,所以说呢,这个东西呢,是在我们后期会学到的啊,现在你不用管的啊,没有用啊,16位它真的是存了个地址啊,就那么多。
37:04
然后呢啊,我们除了这个,我们刚才说了啊,寄存器这个数,这个IP器啊,16位啊有一个特比较特殊啊,它是指指针存器,存储了我们的这个下一条指令到执行的地址,还有我们的什么呢?还有我们的通用寄存器八个,那除此之外呢,我们还有一些叫做断寄存器啊,我们哪些段呢?啊,我们CS段和DS刚才也说了啊,我们代码段和这个数据段啊,是用来存储这些这些东西的,然后呢,后边还有什么呢?ES段啊,扩展段和SS段堆栈段,这个SS段呢和我们的一这个。SP和BP这个寄存器呢,就是密切相关的啊,这是我们后边都会学到的,另外呢,这个呢,是16位的一个状态下啊,当前呢,也没有浮点寄存器,也没有那么乱七八糟的东西啊,如果你在学32位的时候,咱们学到32位了,你会发现啊,它的这个东西还会进行扩展,就会多出来什么呢?FS寄存器和GS寄存器啊,那它里边呢,实际上是指向什么呢?指向T的啊。那你先如果是32位呢,它就是FS指向TB啊,如果是64位,你G指向这个T啊,它是有一定区别的啊,这个呢是我们后续内容,我们先就不扯那么多啊,那么这节课呢,我们的理论呢就讲到这儿,那么从明天开始呢,我们应该是开始写一些这个汇编相关的代码啊,那么现在有什么问题啊,你们就问,没有问题,那我们就换人啊。
38:51
调用约定啊,调用约定就是你函数如何传参呢?你s TD call呢,就是一般情况下就是WIN32的一个,呃,WIN32API的一个调用约定啊,比如说你这个压的时啊进行一个push,然后呢,呃,不用你啊,因为它是一个自动啊,这是S,那它跟它很相像的呢,就是CCCC呢,就需要干嘛呢,就需要你压完之后,你自己站,那就是A再把这个站加回来啊,你比如说PUSH4啊,你就A这个ES给它加回来,那还有什么呢?发字高,发字高是什么呢?快速调用约定在32位下呢,它头两位呢用计算器转,后边呢用对战转战64位下的这个一般情况下呢,所有调用约定都用这个发的变异种啊,前四个用寄算器,后边呢从ES20开始赋值啊。
39:46
还有问题吗?欢迎那个刚进那个直播间的亚风曼时光同学哈,但是今天的技术干货就讲完了,呃,是这样的啊,我们今天讲的这个呢,是一个系列课程啊,就是逆向的这个基础课程,今天讲的是理论的部分,建议你呢,呃。
40:09
没呢,不许走,我还有小广告要打一下,没有,还有小广告部分,如果你不问技术问题,我就先挪窝了,那个是这样的啊,等会儿你先别说话,我先停止录制,然后我挪开。
我来说两句