粉丝77获赞821
大家好,这次我们来看一下这个单步中段, 就单步中段我们前面都用过,就是 got, 就是 t 命令啊,第八个下面的 t 命令,在这个单步中段他是中断的类型是一,也就是硬的一哈,他所引发的中断过程是这样的,先先拿先起的这个中断类型满意, 将 tfif 设为里这个陆战,接下来呢,这个把这个指针地址啊,设置这个 csip 的这这个这个这个地址,就是把 一号中段程序的那个那个中段项链放到啊 csip 里面,让他的那这个中段程序等于执行,那么 tf 等于一,那就执行一条指令后, cpu 就要转气执行一号中段。就是 假设如果这个时候 tf 等于一啊,看我们这里这里要设置为零,但是呢,当 tf 等于一的时候就执行,那么执行一条指令后, cpu 就要转去执行一号中断程序,那么这个 tf 一 tf 零,那他 他到底是一种什么样的关系呢?就是我们在用第八个下面的听命令的时候啊,就是执行一条指令以后,就会显示各个计算器的状态,是吧?那么我们知道 cpu 在执行程序的时候,从这个 csip 指到哪里就从哪里执行,然后接下来往下一条一条执行, 如果这个时候不加以干预的话,那 cpu 只要 cpu 一通电,那么他就从那个 csip 所指向的那条指令开始,一条一条一直往下面直行,那那那就没有办法任何程序能够控制他那个 停止下来,但是呢,我们在第八个的时候看到的时候,就可以控制 cpu 执行被加强的指定,就是执行到一条指定以后,他就会自动停下来,然后显示计算器的状态,那么第八个有什么样的能力呢?为什么第八个能够做到这样呢?就是 这个意思,就是说 cpu 他是这个电路啊,你,你只要一加了电,他就会按 cc 那个 csip 那个指针所指到的那个地,那那那个地址的指令开始,他就会,如果没有干印的话,他就会一直一条一条往下直行。 但是呢现在第八个那个听命令执行完了一条指令以后,他接着就显示那个寄存器,各种各个寄存器的状态,然后就停下来等待我们输入另外的命令。那么第八个为什么能这样呢?那是因为 cpu 提供了一个功能,那么 cpu 是怎么提供了第八个的这种单部中断的功能的呢?在我们在使用 tmd 执行指令的时候啊,第八个先将 tf 设置为一,使得 cpu 在工作于中单部中段方式下,那么 cpu 执行完这条指令以后,就会引发弹幕中断。注意哈,在使用 t 命令执行指令的时候,第八个, 这是第八个会把这个 tf 设置为一,这样就会进入单步中断,然后会调用单步中断的中断处理程序,所有计算器的内容就就会被显示在屏幕上,然后然后 接下来就等待输入输入命令,就是说一条指定执行完了,接下来显示显示计算器的内容,并等待输入,那么这个这个是 tf 等于那个,然后执行一条指定,就 转去中执行中段服务程序,但是呢中段处理程序呢,他也是一条一条指定构成的,你如果这个时候 tf 等于一,那么他执行中段程序本身就是单部中段处理程序本身 新玩的一条指令,他是不是又在那里等,那这个这个一直等下去,那那那那那就不得了了,对不对?你你,你中断处理单部中断处理程序本身一条指令执行完了,你又去调用,另调用另外一个单部中段处理程序, 那那这样就没完了,对不对?所以呢,这这这这个会陷入一个死循环,那 cpu 肯定不允许出现这种情况,那那怎么办呢?就是说解决的办法就是在进入中断处理程序之前设置 tf 等于,从而避免 cpu 在执行中断处理程序的时候发生单补助 中断。这就是为什么在中断过程中有 tf 等于零这个步骤,这个意思就是什么了?在进入中断处理程序之前,这个第八个他是把 df 把这个 tf 设置为一的,使这个 使这个 cpu 啊进入了单部中段处理程序这这这样的一个状态。但是真正进入了单部中乱处处理程序以后,也就说执行单部中段处理程序这个程序的第一条指令之前,他这个 tf 他会让他变成零, 所所以也就是说当执行单部中段处理程序这个程序本身的时候,他这个是不允许这个单部中段发生的,就是按照这就是根据这个 tf 等于零来,所以这样就解决了上面的这个问题。所以进入中段处理过程就 就是这样,像过了类型码,然后把这个设置为理这个最重要的,然后接下来把中段处理程序的那个路口地址复个 csip, 这个复个 csip 在在覆盖之前呢,这个先要保存下来哈,所以这个就这个就通过 tf 为一和零,那就那就死在这个 cpu 可以 tf 等于一,让 cpu 进入单部中断工作状态, tf 等于零,让 cpu 在执行中单部中段处理程序的时候不再发生中断,就是这个意思。那么在响应中段还有一,还有一种特殊情况哈,就是 cpu 在执行完某种情况下, cpu 在执行完 当前的一条指令指令的时候啊,即使发生中断,他也不响应,这个呢就是 ss 跟 spss 跟 sp, 我们知道这两个, 这两个合起来,合起来指向暂停,对吧?但是呢,如果在设置 ss 以后, sp 还没有设置的时候啊,这个时候就说在设置 ss 跟设置 sp 这个这个间隔之间发生了这个中断的话,那这个时候就就会引起错误,因为这个 ss 变, ss 变了, sp 没变 那个那个整个站,站,整个站就就就改变了,那,那就会导致错误。所以 ss 和 sp 的指令呢,要连续存放,使得设置 sp 的指令,紧接着设置 ss 的, ss 的指令直行。你比如这个就是要设置这个,那个设置 ss 后以后啊,紧接着设置 sp, 你在中间不能放另外一个指,这个如果如因为放另外一个指令,如果在这个情况下,这个这个产生的中断呢?哎, 而且 cpu 这个保证他在设置 ss 以后,这条指令他不不响应单部,所以这个就保证了设置 ss, 紧接着就设置 sp, 这之间不会发生中断。这个 cpu 你看在执行完设置 ss 的指令后,不响应中断, 所以在这两者之间呢,他不允许这个,不允许这个中断发生,这个我们看到的这个这个设置 ss 指令,设置 ss 指令以后,但是没有设置 sp 的时候,他是不小心中断。如果我们用 t 命令这个单部执行这条指定以后, 他是看不到寄存器的状态的,因为这条指令以后他不允许中断啊,只有这个也设好了,这个也设好了之后,这两条指令都执行完了以后,他才会响应中断,才会把那个,才会把那个寄存器的状态显示出来,注意这个寄存器的 状态显示出来,他也是一个单部中断程序哈,只先第八个设置好的处理,才能在屏幕上显示计算器的状态并等待命令输入,这个也包括中单单部中断,所以第八个设置好的用来显示计算器和等待输入命令的中断处理程序根本没有得到这些,所以我们看不到一起的结果。 这个呢,我们可以演示一下这个,你看我们看这这三条指令,对吧?现在执行这条指令南部 接下来执行治疗,就是刚才 ss 跟 sp 有连续设置的这个这个问题啊,我们我们演示一下,我在这个程序框架里面,我们加了这啥呢?加了这啥呢?就 ss 跟 sp 啊,我们看到 这个通过这个单步直行到这里啊,零八零九单步直行以后,他这个这个计算器显示出来了,装, 接下来执行这一届,这一届告我踢一下,我们看到他直接就到这里来了,就到这里来了,所以这这个呢,这个这个根本没有单部显示, sp 也没有单部显示,对不对?他这他这里呢?就是执行这一届单部他 sp 直接就变成了零四零六啊,也就是说这 这这这在这个单部的时候,他其实是这两条指令啊同时执行啊,这个 ss 不是也变成了零八零九吗?对不对? ssss 也变成了零八零九, sp 也变成了零四零六,他就是这个意思哈。
大家好,这次我们来看一下中段,中段呢分为内中外中段,内中段一般来说就是由软件指定产生,外中段呢是由外部设备这个他的内个内外部设备的内个内个状态变化产生,比如我们按一个键会产生一个外中,这个内中段呢就是有有有 内部指定一般来说是由内部计算机指定产生,那么中断的意思就这个我们都知道了,就是 cpu 不再接着刚刚执行完的那条指定,继续想执行下一条,而且而是去处理别的事情,那么 cpu 内部有什么事情发生了,需要马上处理的中端信息呢? 这里看一下。这个是零号,一号中的零号中呢就是除数为零的错误,单补中端呢是一号,这个呢是自信应特零自信应特,那这个中的内心码呢?我们看到除外错误是零零号, 单补直行是一号,然后直行线等连直行线,这个这个意思啊,从后面就可以看得出,慢慢慢慢看。这个 cpu 设计一些在中端信息和其处理程序的路口地址之间进入联系,使得 cpu 根据中端信息可以找到要执行的 处理程序。这个中断信息他是什么样子的?首先他要包含有类型码标识,中断元的 类型嘛,就是这个作用就是用来定位中端处理程序。类型嘛,这个比如这个是零号类型,这个呢是一号类型,那比如这个根据中端类型嘛,四就可以找到四号,中端的处理程序可随之 可随随。后来的问题就是这个如果要定为中端程序,那就要知道他的段地址和偏移地址了,从而把那个 csip 那个跟他复职, 是那个 cpu 直行相应的那个那个程序,那么 cpu 八位的中段类型啊,通过中段销量表找到相应的中段处理程序的入口体质。那么什么是中段销量表?中段销量表它其实就是用来存储 中段程序入口地址的列表,就称为中段项链的列。那中段项链表在内存里面保存,他一般是二百五十六个中段,这个八零八六,二百五十六,那么他从哪里开始放呢?从零号单元开始放,零号单元开始放,一一个一个中段 项链,一个中段程序的入口地址,他占四个,四个字节,有有一个 cs 吧,占两个字节, ip 占两个字节,就是其实就是段地址占两个字节,偏移地址占两。所以每一个中段程序的路口地 值都是展示,那么我们看到他一共是二百五十六个至二百五十六个中段元,一共呢就占二百五十六乘以四就是幺零二四个单元存放的中段项链。这个呢我们可以用第八个来看一下, 零零就是零号单元,对吧?这是零号,这就是零号中段的路口地址,那么这个是这个是偏移地址,这个是段,那么我们看这个这个按他的规定哈,这个 这个按他规定,这个这个应该是片艺地址,这个是段地址,这个是段地址。其实呢我们还可以按照他这个地址来来来看一下,他这个是他这个程序, 我们看到这个这个因为他这个高位,高位是在下一个地下一个单元,这个他这个地址呢,应该就是他的那个零号,那个除法为零的终端处理程序,就是 我们经常说那个那个破译什么东西,破译什么东西,他就是这个道理。因为因为这个我们买了一个一个一个别人做的那个机器啊,他有 里面有 cpu, 你不管怎么加密,加密他这个在运行的时候,他这个机器码是一定会,那我们破亿的时候,你只要把这个机器码弄出来就行了,然后再用反馈别人什么东西哈,把这个机器码他对应,对应着指定嘛,对应着相应的指,他就是,其实其实这个就是就是可以,可以, 这个这这这个机器马呢来把那个相应的那个程序啊跟跟他弄出来,那像刚才说的,我们 找到他的中段类型码,然后详细的找到他的那个中段路口地址,最终目的就是为了设置 csip 是 cpu 啊,转过去执行中段处理程序。那么用中段这个类型码找到这个中段项链啊,就是中段程 入口地址以后呢?这个这这个工作啊,他是 cpu 自动完成哈,那那这个这个是就成为终端过程。同样的我们前面的那个扩指令,我们知道你要要要进入中断,要中进入指程序之前呢,你先要保存 csip, 然后,然后呢 再设置新的 csip, 等扣完了之后啊再恢复 csip。 那么八点八六 cpu 中端过程大概就是这几步了,第一步起到中端类型吧,第二步来啊,这个保存标志计算器, 我们前面说过的这个还有设什么 tf 的 if, 这这个我们以后再说,然后要保存 csip, 再从啊内存地址中段类型码城市, 这个城市是因为刚才已经说了是每个中段城市的路口地址占四个字,城市和中段内心夹。啊,这这两个字,两个字单元里面出 出了一个程序的入口地址, ip 和 cs, cpu 在收到中断信息之后啊,然后就就执行一个硬件自动直行的中断过程,中断过程的主要任务其实就是设置 csip, 哈啊,完事之后又恢复 csip, 先保存, 再设置,再恢复,就这个这个自己看,这个就就是在中断之前呢,该保护的就要保护,这这个用用这个,用这个简洁的表示就是这样。 那中段处理程序呢?就是随时都可能有中断,对不对?我们按键呢,这个随时都有中断,所以中段处理程序的路口地址啊,路口地址要存储,存储在中段销量表里,这个中段程序呢,必须也也 也必须一直在内存的某段空间里,这个程序随时要调用这个步骤,这个刚才跟刚才的说差不多,还是刚才那个该保护的保护,然后啊,调用完了之后呢,啊就出站了,对吧?然后回到这个自行继续自自。
一条会编指令是怎么被 cpu 执行的呢?首先我们这一条指令是放在内存里面的,因为我们的 pc 保存的是下一条指令所在的内存地址,当我们想要执行下一条指令的时候, 将该地址传递给内存,然后内存就通过数据线返回我们需要的数据了。举个例子, pc 当前为幺幺二三,内存幺幺二三出,保存的指令 a 点一百二十, cpu 通过地址线将 pc 的值传递给内存, 内存拿到地址一看,哦,原来你要地址幺幺二三出的东西,然后内存便将数据通过数据线传送给 cpu。 cpu 拿到这条指令,总得先找个地方把指令保存着吧。所以 cpu 就有了 一个叫做 r 的寄存器,用来保存我们需要执行的指令。保存完成之后, cpu 就开始翻译这条指令了。 cpu 翻译完成这条指令, 就知道你想做的事情就是先取出二一的内容所指的储存单元的数据,然后取出寄存器二零的值,通过由相加, 最后将结果送回二一的内容所指向的内存单元中保存。翻译阶段过后, cpu 就知道该做什么了。 比如说我们这时候二一寄存器的内容为二二三四二零寄存器的内容为三,内存中地址二二三四对应的内容为四。同时我们还有个阿鲁可以用来做加法操作。大家可以看到,二一二零以及奥丘路口的输出都是连 接在一条线上的,所以二零的出口,二一的出口以及欧陆的出口都需要安装一个门。此处为形象起见,只有门开了,数据才会跑进来和传出去,绿色代表门打开,红色代表门关闭出示状态,大家们都是关闭的,所以都是红色, 然后开始执行,首先要根据 r 一找到主存中对应的位置,所以可以将 a 一的二二三四通过地址线传递给内存, 具体怎么传呢?首先打开红色门,一盒红色门板,然后二二三四就沿着线传递到数据线,然后交给内存了,做完之后我们的门又得关上了,然后内存便根据地址二二三四中获取到对应的内容。打开红色门九 和红色门三,这样数据四通过数据线跑到了我们的暂存器中,关闭门三和九,然后这时候我们有一个阿鲁,这是什么东西呢? 简单来说就是输出两个数,我们可以进行一些算数运算,然后输出结果,第一个运算数字已经放到了欧陆的一个输入端了,我们只需要同时打开红色门二,门五,门四和门六, 然后再给阿鲁施加一个加法信号,结果维基便会直接输出到暂存性,那么我们再将所有的门复原, 最终我们需要将我们的数据输出到储存,只需要打开七号门和九号门,这样我们的数据漆就通过总线流到了数据线,然后内存这时候还是保存着对应 r 一的内容, 也就是地址,所以当我们的数据期传递到数据线时,内存就会将该数据写入到地址二二三四中了,也就是我们地址二二三四的只变成了七。指令完成,我的任务也完成了。
大家好,这次呢我们来看一下这个除法错误中断的处理方法,当这个当这个错误当除法除数为零的时候了, 他出现这个这种情况,我们现在我前面知道这个就是中断类型为零的,这个中断了,他就是就是处理这种除法为零的那那那个错误,那么我们来看一下这个结果啊,他会这个除数嘛,对吧?这个 div bh 注意哈,这个是 b h b h, 他他这个这个会出现这种这种这这种这个就是 dy 的 l floor 就显示这个信息, 我们看到这个是这个是除数为一哈,这个这个不是除数为零,除数为一,除数为一,这个是一出,因为他这是八位除法哈,我们可以 先回去看一下他这个八位处罚他,他的那个那个伤是放在 ao 里面,那个那个移速放在 ah 里面,这个 ao 放不下一 一零零零,而且所以溢出了 lvflow。 如果现在我们改变那个零号中段,在屏幕上显示重新写一个零号中段程序,那么功能在屏幕中间显示 lflow 后,然后返回到操作系统,这个是原来的这个,这个是溢出哈, 然后一出跟那个除数为零,都是零号中断,那么我们也在屏幕中间显示 of 罗这个做这个事情, 那么我们应该做什么事情呢?当发生除法一出的时候,产生零号中断,因为引引发中断过程,然后要做的事情是这个首先起的这个中断内心马力,然后把这两个标志集中去录赞,这个录赞,然后把这个 把这个中段程序的那个地址段地址和便宜地址放到 ip, 那么按落下步骤就是就是这样处理一下,现在问题是我们要把这个字符串显示出来哈,显示出来以后,然后就反剁死,那么我们把这段程序称作 do 零度零哈,放在内存, 因为除法艺术随时可能发生, cpu 随时都可能将 ip 直向这个路口直行车。那么 d 幺零应该放在什么地方呢?因为我们这个现在是在 在操作系统上使用计算机所有的硬件资源都在操作系统的管理之下,所以我们想要得到一块内存来放来放置这个程序,这个时候应该向操作系统申请,但是呢 我们看一下这个目的是什么?我们现在是在计算机底层编程,我们就直接那个面向硬件资源,那么问题 就变得简单了,我们只要找到一块那个别的程序不会用到的内存器,将 do 零传送过去就可以了。这个前面讲了,这个这一段内存空间是没用过的,我们前面用过这段这段内存空间哈, 这段内存空间是系统重放中段程序入口地址的中段项链表。但是在这段内存空间里面呢,他他没有放满,因为一 k 可以放二百五十六个,他没有那么多啊,他没有那么多,所以他有 很多单元是空的。我们我们现在要做的事情就是把我们所写写的那个低过零那个除法一出程序放到那个这种空的空的这个这段内存空间里面来。 所以我们现在要做的事情啊,是那个除法溢出中断,程序已经有了的,系统里面已经有了,现在我们要重新写一个,重新写一个,我们就可以这个, 这个估计出,我们可以估计 d 二零的长度不会超过二百五十六个字节,这样我们就可以把这个传到这个,那么如果把中文处理程序放进去以后啊,那就必须把这个路口地址, d 二零的路口地址 放到这里来,以后路口地址要放到中段项链表的对应表象里面去哈,要做放到中段对项链表的中段项链表的那个那个相应的乘坐单元,那就是我们把那个中段处理呈现的路口地址 从这里开始放,这里放偏移地址,这个呢?放断地,我们中段中段项链表不是每一个中段占四个字节吗?对不对?零号他就是第一个, 你第一个中端中中中端项链,也就说把这个段地址放在放在这个这里,这两个字字字字单元里面 这个,然后把偏移地址放在这个这个里面,就是说断地址是放在这个单元开始,两个字节偏移地址放在这个单元开始。所以综合上面分析,我们要做以下几几件事情。边写一个可以显示这个字符串的中文书,叫迪欧尼,接下来把迪欧尼送到这个地方, 接下来把第二零的入口地址存储在中段项链表零号表象中,所以我们要做的是这些事情哈,就是重写一个除法,一除法那个溢出中段程序,那么程序的框架大概就是这样。
啊啊 这两天新做了个片头,是不是跟电影大片似的,片尾也换了,留了一道题,各位去做做试试。 头顶妈斯这系列已经到了第十话,我们学习了很多计算机底层理论,也使用汇编语言开发了一个小程序,并且在虚拟机还有真机上运行起来了。但是我并没有详细解释过为什么要学习汇编语言,学完了能干什么? 所以本期视频我们先来解决,五 w e h 就是 wort one two one 为好。要解释会编语言是什么,得往底层走,计算机在硬件层面 是里面的高低电压在策马扬鞭,当然电压你是无法直接看见或者听见的。控制方法很简单粗暴。早期的计算机是直接通过波动开关或者插拔电线来控制计算机, 当年的计算机很庞大,而且原件电线都是裸露的,就比较容易坏。比如编程语言之母格雷斯博士在为 max 二型计算机写程序的时候查找一个问题,最后是发现计算机里有个虫子弄坏了一个原件,导致计算出错, 重字英文名就是 bug。 从此 bug 就成为计算机软硬件缺陷的代名词。然而通过开关或者 插拔电线的方式实在是反锁器容易出错,所以人们用零合一来代替低电压和高电压。 当然这并不代表人们就使用二进制,键盘编程只是一种人类更加容易理解的信息。这些零和一的序列就可以控制计算机 cpu 进行各种动作,一组一组的零一序列就是一个一个的指令,这些指令就形成了一种语言,称之为机器语言。 具体这些机器语言是怎么输入的呢?首先你用零和一在纸上写好了程序,然后再把这个程序的零一序列打到纸袋上, 纸袋分割成等长的块,每个块上有孔代表一,没孔代表零。计算机读入程序的时候,就会用到一个碳针去戳,戳到孔了就是一,没戳到孔就是零,这样的话,零和一的序 就被计算机读入了。这就是当年前辈们的编程方式。机器语言还是太繁琐了,也很容易出错,比如少打了个孔或者多打了, 这其实很不容易查找出来,找到后,改程序的方式也简单粗暴,如果少打了,就戳上个孔,如果多打了,就拿胶带补上, 这就叫做一个派尺,也就是补丁。我们常听说的软件补丁就是这么来的。聪明或者说懒惰的人类再次发动了脑筋,零和一的序列不好记,那么我们就给他起个代号呗。我们之前也简单定义过几个指令, 用漏的 a 来代替零零零零,用漏的 b 来代替零零零幺,这样对人类来说会更加易读,编程过程会更加友好。那么这就是会编语言看起来相对来说 还是比较底层的对不对?实际上也的确是这样,会编语言是非常接近计算机底层的,所以他才会让你更加深入的了解计算机, 你了解的越深入,编程其实对你来说就更容易。然而会编语言仍然相对来说比较繁琐,实现一点点功能都要写很多行程序。 所以人们又产生了新的想法,我能不能把这些会编语言打个包呢?让我写一行代码就能顶十行会编,于是高级语言就顺理成章的出来了。高级语言,比如 cc、 佳佳、扎瓦、拍粉等等, 编程效率的确比汇编高多了,但是并不代表他们比汇编高贵,任何高级语言能做的事,汇编都能做,毕竟高级语言就是打包了。汇编语言指令主要是考虑编程时间、成本和效率的问题。 所以会编语言是介于机器语言和高级语言之间的一种计算机指令的代号,它是一门很接近计算机底层,连接高级语言跟计算机硬件的编程语言。 为什么学习会编,想成为一个大师?学习编程的路线有两种,第一种是从计算机硬件原理开始学习, 这个路线的起步很高,而难度是一路下降。第二种是从高级语言开始学起, 紧接着学习各种库以及框架,难度则是一路上升。也许你可以知道退休也用不到会编,但我的观点是,学习会编语言可以为学习任何编程语言打下坚实的基础, 加深你对计算机系统的理解。如果你真的想成为一个编程大师,那么底层原理还有汇编语言是必 旅游之路。我们花时间精力去做一件事,要从两个角度去看收益,一是能否可以直接应用于工作中,产生经济效益,升职加薪。 二是能否对后续的学习提升有用。也许功在当代,利在千秋。我个人是倾向于第一种学习路线, cm 系列也是按照这个路线图演进。 谁需要学习会编?编程呢?是适合男女老幼的九九六 icu 只是人们对他的表面看法,只要想学习编程的人,最好都学学会编对于高级语言框架软件库的学习很有好处。 到哪里学习会编呢?既然你都看到这里了,跟我学肯定没错,但是呢,我这视频长度是有限的,所以只能展示最关键最必要的部分, 可以作为一个向导深入学习,还是要多看看书,同时也要多跟别人沟通交流。成长是飞快的,什么时候开始呢?最好的时机是十年前,其次就是现在了。 怎么学习会编呢?学会编要三条腿走路。首先是理论知识学习,无论是看书看视频也好。 其次理论要结合实践,一定要加强练习,才能巩固学习成果,知行合一。最后自己要勤加思考,多多融会贯通,知识才会牢牢的进入你的脑子。这三个步骤并不是孤立的, 而是要在日常学习中不断循环,遇到不会的地方,如果自己想不出来,那就寻求帮助,上网查答案,或者在评论里咨询,加入讨论群来咨询高手大仙 总会有解决的办法,不要把问题放在那,时间一久肯定忘了。学会编是一个较为痛苦的修炼,是编成的永久性地基,所以学会延迟满足,到后面你会为现在的你骄傲。 好了,往后我就不在视频里叭叭这些问题了。今天我们来正式认识第一个会编指令, 在肖申克的救赎里,安迪找大红买把锤子。这把锤子的旅程就很像数据在计算机里的进进出出。首先锤子从外部的卡车进入了监狱,如同从移动硬盘或者优盘拷贝到计算机内部硬盘。 然后锤子在洗衣房被小黑揣在怀里,这就是数据进入了内存。领床单的时候,小黑又把锤子交给大黄, 这就是数据到了 cpu 的计存器。大红回到牢房后,把锤子放到老布发书的小车车上,数据再次进入了内存。 最后锤子来到了安迪手里,数据进入了 cpu 的另外一个计算器, 而安迪把锤子藏到了圣经里,圣经就是高速缓存,当然最后 cpu 直接跑路了,这我就研究不了。在计算机整个运行过程中,基本就是数据的输入、输出与处理, 我们首要解决的问题就是搞清楚在计算机各个部件之间,数据是通过何种方式传递的。墨五指令应用在哪一部分?我们先来看墨五指令的基本格式,墨五后面跟着两个操作数,一个圆一个目的, 而且目的在前,中间用逗号隔开,如同你可以把鸡蛋放到手提包里,也可以把手提包放到篮子里,但是你不能把鸡蛋放到鸡蛋里。 目的操作术必须是一个容器,而圆可以不是木物指令的操作对象有四种,首先是 cpu 里面的通用计算器以及断计算器,然后是内存单元,最后是立即数,也就是长数。 我们从立即竖作为原操作术出发,那么目的操作术有四种,立即竖是不能传送给立即竖的,但是可以传送给内存单元, 也可以传送给通用计算器,但不能传送给断计算器。然后我们来看内存, 某物指令不能在内存单元之间传送,当然也不能传送给立即数,但是可以传送给通用计算器以及断计算器。 再来看通用计算器,木五可以在通用计算器间传送,也可以传送给内存单元。断计算器也是可以的,但是不能传送给立即数。 最后我们来看断寄存器,断寄存器之间是不能互相传送的,但是可以传送给通用寄存器以及内存单元, 当然是无法传送给立即数的。这就是默物指令可能遇到的所有情况,一共十六种, 我们去掉不能操作的七种,允许操作的还剩九种,这就是默物指令的全部应用方式了。好了,本 期视频就到这里,课后习题是个二进制转换,记得解一下。
大家好,那个汇编语言啊,我们用汇编指令写成的程序以后,他要运行的话,他要经过一个编议的过程,这个编议的过程其实就是把这个注记符,就是汇编指令这个帮助记忆的这个符 号啊,把它转变成这个相应的机器,然后这个才能够执行。那个上次已经说过了,就是这个零啊,在在 输入计算机以后,这个零呐,其实就代表一个低电压,一呢,就代表一个高电压零呢,或者代表零服了,一代表五服了,这个这这样呢这个电路呢,计算机这里面的这些电路呢,就可以执行进行相应的动作,这个呢就是 其实这个其实就是一个计算机程序执行的那个最最本质的过程,汇编语言这个组成,他包括汇编指令为指令其他符号等等。但我们这个这些我们的后面会 看到那 cpu 呢?他他是计算机的核心部件,那么他他要他要执行一个程序,那么这些程序放在哪里呢?所以呢放在哪里呢?放在放 存放的这个这个电路,电路啊,他就叫做存储器,就是计算机里面呢,我们所说的这个各种各样的部件呢,他其实都是相应的电路,也就是这个存储器呢,就是我们说的内内存,这个内存是非常重要的,没有内存吧,就说那个 cpu 那个没有东西执行啊, 就就做不了事情。这个就相当于什么呢?就是比,比如我们人脑,人的脑袋关里面,你你你要去算一个 一加二等于三,你首先要要要把这个一加二记到我们脑子里面呢,对吧?然后我们才能够把它算出来,你这个一加二脑袋里面什么都没有,你去算什么,你即使你算的再快, 他没有没有一个题目给你放到,放到你脑袋里面,你,你也就没办法工作啊,这是跟我们人脑是一样的道理,这个用于纯粹的,还有那个硬盘的磁盘指令和数据是应用上的概念,在内存和磁盘上面指令和数据没有任何区别,但是呢,这个内存跟磁盘他还是有有有 这个很重要的区别的,磁盘跟内存不一样,内存呢,它是用电信号,它是电路,这个磁盘呢,它不是电路,就比如我们那个硬盘,它是用用小磁针那种磁粉来来存出信息,所以 cpu 呢,它只只只能用用电流来驱动你,如果 所以 cpu 啊,要读到词盘里面的信息,先要把词盘的信息放到内存里面才能够读的到。哎,这个就是这个道理,就是很简单,就是 cpu 它是由电驱动的,内存也是由电驱动, 就是电路对电路他才能才才能够相互发生作用。所以这个磁盘先要磁盘的内容先要放到内存里面,才能够被 cpu 防。那不管这个内存还是磁盘上面这个都是二进制信息,这比如这个是二进制,那么这个相当于一个这个这个十六进制数了,这是一个指令 存储单元,就是这样,这这一个一个这个存储单元,其实他反正每一个都是电路啊,对,这个相当于那个有八位了,一位可以存出一个零 或者一个一,这个我们到后面慢慢会会清楚这些概念,那这个也是我们最简单的概念,这个一 k 就是十二的二的十次方,就是一零二四,这个是二的二十次方,这个是二的三十次方, 这个是二点四十次。这个磁盘磁盘的容量一般要比内存大很多,这个大写的笔是代表字节八位,八位,因为就是一个一 或者一个里, cpu 对存储器读写就是存储单元,每一个存储单元他都要有一个地址,有了地址以后啊 cpu 才能够找到他,找到这个单元,然后才能够把他的这个数据啊单元里面的数据读出 出来,当然还有读写控制了。那么 cpu 通过什么将地址数据传出,那个传出到传出芯片呢?电信号就要用,因为这个计算机这个 cpu 处理信息的时候是通过电电电信号的电信号,那那肯定要有导线,这个导线呢? 这个在计算机在物理上就分为这个地址总线、数据总线、控制总线,这个我们可以看到这样的一张,这是 cpu, 你比如跟这个这个跟这个连在一起,跟这块芯片连在一起的, 那那这个数据呢?就通过这些这些线,这些导线来传输,这些合在一起的他就分为称为总线,如果是传输地址信息的话就是地址总线,如果传输数据数据信息的话就是数据总线,当然如果是传输控制信号的话,那就是控制总线。
大家好,本期主要给大家讲一讲会编语言的介绍。会编语言是一种面向机器的成设计的低级语言,是企业在硬件之上工作的编程语言, 利用硬件系统的结构和指令,灵活有效的控制系统的正确执行。一般来说,高级语言先编译成会编语, 然后链接生成机器源,特定的会边缘和特定的机器源是一一对应的,不同平台之间不能直接移植。 每种灰边盐都特定于特定的计算机结构,有的也特定于操作系统。我们过去讲的有大灰边,比如说八六系列的小灰边,五幺系列的之分,随着技术的发展,这种 区分估计现在也不是很明显。现在比较流行的 h m 三二单片一的开发,我们学习和了解会编的目的无非有三, 一是通过学习会编语言,深入了解计算机工作原理和计算机软硬件的其结构,为日常的单位编写提供重要的参考依据。 二是呢,为了实现非高级一元能够实现的或提高效率优化代码的场景需要包括编写系统引导程序、硬件底层驱动或硬件控制程序等。 三是逆向共同中的使用,通过反变异执行程序,有效分析和判断软件系统执行过程中的缺陷及流程异常节点,当然了,也是黑客破解程 的重要手段。会编语言一般来说由会编指令、为指令及其他符号组成。会编指令和机器指令是一一对应的,为指令和其他符号,由会编程序识别并执行。所以说会编语言的核心就是会编指令。 汇编指令大体分为传输指令,包括数据传输、输入、输出目的地址及标志位的传输等。预算指令,包括算数预算和逻辑预算、减减、乘除,亦或与或非,或者亦或 取、反、左移、右移等操作。串操作呢,包括串传书、串比较、串的装载和保存等等。控制指令呢,包括无条件、有条 条件的转移,包括循环,包括短地址转移,包括暂停、空操作、置位、中断等等。那么了解汇编语言呢?首先必须要了解寄存器和内存的概念及工作机制。 计存器是 cpu 内置的数据存储器,是指令执行的数据存终点、执行程序和应用数据储存。在内存中, cpu 通过指挥计存器和内存进行数据交换,达到指令执行的目的。 不同的 cpu 计算器的数量和定义不同,需要根据特定的定义来学习和使用。 s t m 三二和 c 五幺就不同,所以需要大家根据 c 五幺的手册和 it m 三二的手册去学习和了。 了解内存的使用根据系统执行和用户的请求不同,分为站和堆,站执行的是先入后出的原则,而堆不主动施法,需要手动处理。 其次要了解数据的存储方式,大端模式和小端模式。大端模式和小端模式针对多字节类型的数据来讲,包括字、整数、复点数以及结构对字节数组无效。 我们平时涉及到的单片机开发的基本上都是小端模式,大端模式一般应用在网络传输和高级员的应用中。好的,本期就讲这么多,谢谢大家。
大家好,这次我们来看一下这个印的指令,那印的指令前面呢,我们已经讨论过了,这个就是这个印的铃,就是除法一出指令,这个除法一出呢,一出指令 那个那个那个中断,除法一出中断,印的就是中断啊,除法一出中断呢,他就是当那个除数为零的时候,会发生一出中断,除了这个之外呢?当那个除数得出来的伤啊,比那个寄存器能够表示的数的范围 还要大的时候,就是超出了那个寄存器的那个表示范围,这个时候呢也会发生溢出,所以这个就是印特,印特林中段,就是关于印特林中段呢,我们这里再补, 再补充说明一下。首先这个程序的中段是从这里开始,这个这个才是真正的中段程序。中段程序 这个呢,这一部分就是说他的那个入口地址是被送到了那个中段项链表里面的,这里我们也可以看到这里,这里是把他的这个中段项链表里面是送的是这个这个度度开始的,这个就从从这个字母开始的,这个地址 把他送到了中断项链表里面。所以在任何一个程序发生那个处罚溢出中断的时候,他都会调用这一部,都会调用这一部分, 所以呢这个字,这这串字母啊,他要放在这个肚里面,为什么不能放在那个那个数据段里面呢? 我们看到这个,这这个是放在数据段里面的,单单的这个是不行的,为什么呢?因为因为这个程序运行的时候,他是有这个数据段的,对吧?有代码段,但是这个程序一旦那个终止了,被释放了,就是 被运那个停止运行了,那么他占用的这个数据段、代码段呢?就会被释放掉,被释放掉了,这这个地址里面放的内容啊,有可能就会放别的内容, 就会放别的了。所以当别的程序发生除法溢出中断的时候,如果,如果按这个地址,因为他这个是按照这个地址来的吗?按照这个地址来的,他这个显示的时候呢,是按照按照这个地址来显示的哈,按照这个地址来显示的,所以呢这个就会就会出问题,就会显示不出来。 那么中断就是当有内部有需要处理的事情发生的,就就会引起中断。内内中断就是指,其实就可以简单理解为指令引起的中断。外中断就是外部设备那个状态发生变化,比如按按键那个产这个前面我们讲过两两个中,两两种中断,一一个一个就是除法中断, 一个就是那个单步中断,那么中断的过程就是这个了。 i f t f 这个我们也都都已经讲那个,这这个呢,我们就看到这个,这个,比如这个下面这个程序,他是就是要要要这个显示一个一个一个东西,哈,显示这这这个支付串,然后返回到系统里,这个 这个惊叹号我们在诚信里面看到了,对吧?就显示这个惊叹,那为什么,那怎么来显示这个 lflow 里外的 lflow 在穿制服穿呢?因为这里我们调用了这个中断啊,调用了这个,所以调用完了这个零号中断,然后又返回到系统这个 inter 指令的最终功能呢,他就是跟那个 跟那个是扩指定是差不多的,这个呢我们可以用硬的指定调用这些指程序哈,当然也可以自己编写一些中断程供别人时,那么我们通过两个问题来讨论,这个可以,可以供应用 一些调用的中段历程怎么来编写。比如现在我们要做一个这样的中段程序,就是七十七 c h 这个数,这个这个这个中段呢,他就是求一个 word 型数据的平方, 数字的平方,这个 word 嘛是两个字节了,就是两个字节的数,我们把它算出,算出平方来,这个我做这个就是当我们写指的 inter 七 c h 的时候,就能够调用到我们这个写的这个中断程序, 这个程序的框架大概这个音的七十一群,这个是我们要写的,我们把它这个输入是按照 ax 是放到 ax 里, 然后呢我们我们这个计算,我们看到计算 ax 的平方啊,数据平方,然后这里这个结果,这个这个乘以二,然后这里这里呢放存放结果哈,并且将结果乘以二,就是 这个程序啊,我们要做的事情就是求一个十六位数的平方,然后把高位放 dxd 位放 ax, 接下来呢我们调用这个以后啊,他的结果就会在 ax 里,就会放到 ax 跟 dx 里面,这这个指定是把他那个 这个那个放结果,并且将结果乘以二。这个那么我们要做三部分工作,第一就变成实线求平方功能的程序,然后要安装,然后要设置中断项链表,因为是 inter 七 c h, 那么这个七 c h 这个这个这个表象里面就必须要放置,要放放置我们 所编写的这个程序的路口地址,就是我们始终记得有有这样一个中段路口地址表,就是中段项链表啊,那个七 c 印的七 c h, 那就是七七 c d, 七十一个单元,七十一个单元,七十一个单元里面放的就是我们所编写程序的那个路口地,这就是设置中这个就叫设置中段项链。然后在这个最后要使用艾瑞特指定就是一道 这个从中段返回到那个主程序哈,就是艾特特其实就是破破 ip, 破破 cs, 就是接着中段程序执行完了以后,就接着往下执行这个当前的 csip 会被押押进站,然后用这个特这个回来回,回到这个这个主程序来, 接下来我们就要要把这个这个这个编写出来这个程序并且安装啊,这个程序呢就是就是把这个数据段里面这个字符啊转转化为大写,这个我们都都都看过了,这个这个意思就是就是我们这个七七夕啊,就是刚才 是做了那个求一个数的平方,这里呢是把那个字符转化为大写。这个其实我就是说我们我们用同一个中段,来来来编两个不同的程序哈, 这个是求那个一个数的平方的那个七七七中段,这个就是跟我们前面的那个一出中段呢,其实差不多的差不多,这里关键是首先是要把那个,把那个程序 要要复制到这个这个这个地址里面去哈,复制到地址里面去,接下来呢就是设置中断项链,接下来就是这个程序哈,就是这个程序,这个其实很简单, 这是 sqr 这里开始到 sqr n 的结束,我们看到这是 sqr 开始,这个是这里结束。这减 先剪辑这个就是把这一部分内容复制到零二零零那个那个那个单元里面。那接下来设置中端项链,接下来编写这个程序就完了。 这个呢就是把字母那个转化为大写,那也同样的先是把这部分内容拷贝到零二零零这里去, 接下来呢就是设置中断项链,接下来就是把这个程序写出来。这个程序这里关键是这一句就是转大写了,所以这个这个这个这个写一个中段程序来,其实就是三步,对不对?首先就是把它拷贝到一段没没有不会被使用的那个内存空间里面。 第二步呢设置中段项链,第二步就是设置中段项链。第三步呢就是把这个程序本身写出来,所以印特指定呢,我们完全可以自己写。