00:00
好啊,到我了啊,然后咱们就开始今天的这个正式内容啊,首先咱们今天讲的呢,就是开始讲16位汇编了啊,咱们整套课程呢,有十六三十二六十四啊挨个讲,那首先呢,还是由最古老的16位开始啊,那我们呢,先来这个配置环境啊,然后一边,因为配置环境肯定是中间需要一点时间啊,咱们就一边配一边聊啊,这是VM啊,然后呢,我这个版本呢,是看一下啊16.2啊嗯,然后呢,我现在呢,就要用它来搭建一个叉P的一个虚拟机啊,用来这个讲16A的一个汇编的一个编写啊嗯,我们点击下一步啊,然后这随便啊下一步然后呢,我这安装的一个,嗯,ISO的一个镜像啊,就在我的这个课件里边ISO镜像,然后点击下一步,这里随意啊,点击下一步啊,然后否啊,然后嗯。未输入啊简易安装是啊,继续是,然后呢路径啊,我这儿呢,随便选一个盘,然后。
01:03
呃,虚拟机啊。XPMSM。确定下一步把这个名字也给他改一下吧。下一步啊,我这核心数呢,我给了四个啊,然后内存呢也给了四个啊足以吧,然后点下一步啊,然后我这里选敲击下一步啊下一步下一步创建新的硬盘40G够用啊,然后直接继续点击下一步,然后完成,完成之后呢,它会自动的给你这个进入它的这个超级系统开始安装的一个步骤上。
02:08
好啊,那现在呢,他开始这个安装了。里边这个评论不知道怎么卡住了啊,我这边开一下。稍等啊,现在发评论我看不太见啊,然后我要重新来进一下。好,重新进来了。那这个过程中有什么问题,你们先跟大家就可以先问啊,因为我这里呢,是在这个安装环境的一个过程中啊,这个过程中呢,可能需要几分钟啊,稍微有点慢啊,他现在呢,正在复制一些系统的这个组件啊。
03:04
然后咱们。嗯,啥玩意,打一波小广告啊。就是那什么,如果说那个你们需要这种类似于镜像啊,或者今天需需要用到的这种这个工具啊,还有这种什么呃,什么link呀,Msm这种连接器汇编器啊,这种东西啊,如果你需要的情况下,你就加咱们的这个小助理啊,然后呢啊,找他去要啊,加群啊。包括这个系统镜像也是啊,如果你们需要各种各样的东西啊,都需要去联系咱们的助理获取啊。如果谁想这个加助理,或者说这个想进群啊,获取东西之类的,你就在评论区说,然后呢,让这个助理发这个联系方式啊,你们再联系啊。好,然后现在呢,他开始安装啊,我们稍等。
04:17
他写的安装程序会在39分钟完成,但是实际上并不至于用这么久啊,它这个东西相对而言还是比较快的,嗯,但是他这个快慢速度呢,主要取决于你的本身的一个硬盘的一个速度啊。硬盘CPU内存的速度也不能说完全是硬盘好,你可以看到它已经开始安装设备了啊,所以到这一步呢,就相对其实是比较快的啊,不至于卡那么久。哎,你看这个绿条啊,直接到一半了啊。哎,我录上没录上我那个。我录像球不知道怎么缩回去了啊,我给他点出来。
05:07
哎呀,欢迎各位新来的同学啊,这个有问题咱们现在问啊,我正在这个装环境啊,所以说呢,这个现在没什么操作啊。我操,这么恶心,你是认识我对吧?嗯,咱咱们群里一般这么恶心的都是和我比较熟的。好,这一步基本就完事了啊,我们现在呢,就直接点下一步,我们也不需要给他输入这个密钥啊,我们直接点否,然后继续就行了,然后他就会继续这个安装它的这个配置。
06:11
这这几步其实都是很快的啊,你可以看到他写个30分钟,其实并不需要那么久啊。嗯,需要注意一点啊,就是用这个叉P尽量用快照的形式保存啊,尽量不要激活它啊,激活了会触发一些奇怪的问题。也不知道是现在这个叉P在对这个新的这个虚拟环境不太好还是怎么样。反正呢,会遇到一些这个比如说无线激活之类的问题,应该是激活的不完整。好,马上完成安装了啊,就剩最后一小块。
07:07
好,注册组件啊,稍等片刻。在咱们搞逆向的过程中啊,比如说去搞一些什么病毒啊漏洞啊,其实很大的这个精力都耗费到什么上了呢?一个是寻找他的这个软件源啊,然后比如说你病毒就找这个样本,你如果是漏洞的,你就找他那个能触发漏洞的这个版本的软件啊,这种东西啊,然后其实都是很费精力的,因为有些老软件你确实不好找,然后还有还有就是什么呢?比如漏洞,你去找他可以触发的这个PC啊,也很难找。好,马上结束了啊,这个别着急啊。
08:06
哎,写个求赞你你有漏洞的程序,你比如说我微软操作系统有漏洞,你自己写微软操作系统是吧。你要说你写个Linux,你靠着细微大法,反正是开源的,你有声之前也能拷贝完Windows,人家闭源系统你怎么做,操W吗?啊,他这个就安装完了,开始进入超系统了,然后他进入设置之后,可能会经历一次重启啊。
09:00
好,可以看到啊,我们进来了。蝎子来了,哎。这个ID收啊。好啊,这个就差不多了啊,然后我们把这些东西关掉,然后等他个人设置设置一下。好,然后呢,进来了啊,进来了之后呢,我们给它简单设置一下它的这个桌面啊,把它自定义桌面打开啊,他在装这个压末,我们不用理他啊,然后把这个我的电脑和我的文档给显示出来,确定啊应用确定。
10:01
好,然后呢,他开始装这个VM,这个V的一个vm tooth啊。这个VS呢,主要的功能呢,是帮助你从这个虚拟机内和虚拟机外呢,进行一个文件的拷贝啊,啊这里还有什么这个显卡驱动啊,鼠标驱动这种东西,比如说现在它这个屏幕显示就这么一小块,当装完这个V的这个兔S之后呢,它就会有一个显卡的一个呃驱动安装上啊,就会有一个自适应啊,它就会变大这个屏幕。啊,他现在重启啊,然后加载。16位必须。32位咱们直接用WIN10。因为咱们现在的WIN10操作系统是没有办法运行16位程序的,只有这个类似于叉P或者32位操作系统才能兼容它的这个16位的程序,因为咱们现在讲的是16位汇编嘛,等等咱们讲到32位汇编的时候,咱们就用WIN10了啊,这个是这个年代限制嘛,毕竟它这个16位他不可能一直兼容,对不对。
11:24
好,然后呢,我们现在呢,拿出这个ma SM啊,它这个呢,就是用来汇编和链接这个16位汇编的这个东西啊,那这个文件夹里呢,一共有三个东西,如果要获取呢,就加找小助理啊,这个呢msm呢就是16位汇编啊,在Windows下的一个汇编器啊,这个LK呢就是链接器啊。这个ML呢,就是综合了他们俩自动帮你这个汇编和链接啊,直接给你造成造出一个EE文件啊,那我们Windows操作系统下的可视性文件的后缀呢,通常情况下呢,包括什么呢?包括我们e SE DR sys这种东西啊,那我们现在呢,要用的呢,一般情况下三环的一个可视程序呢,就是你你你正常情况看到的类似于QQ啊,啊什么这个WPS这种应用程序,它通常都是的,当然可能有很多的这个库,包括这个动态链接库D之类的东西,但是我们现在这个版本呢,因为它是16位的一个东西啊,通常情况下,我们只要把它这个编译成这个我们Windows支持的一个ESE就行了啊,然后呢,它这个是一个什么过程呢?首先你有一个汇编的原文件啊,原文件一般情况下是1.asm结尾的,当然你不这么写,其实也能编译成功,然后呢,以这个结尾这个开始的这个原文件,原文件呢,经过mam进行汇编,汇编后它会生成一个点这个OG啊,OBG的一个这个中间文件啊,然后有。
12:46
这个中间文件呢,再经过这个连接器的一个链接啊,最终会形成一个EE,那这个呢,就是它的一个功能啊,那我们现在呢,先从外边写代码,因为里头呢,我没装输入法啊,咱们就直接从外边写,然后再拷进去运行啊,我外边运行不了,但能写啊,其实WIN10呢,你要装一个那个DOS的模拟器呢,也能也能写16位汇编,但是咱们为了这个就是学习Windows下的东西啊,所以我们用这个Windows的这个套件啊,就是包括我们的这种东西。
13:24
啊就这样,然后呢,现在呢,我直接啊用这个我的notepad加加把它打开。打开之后呢,我现在就要写了啊,那首先呢,我们昨天学过一个概念,就是代码的一个概念,那么正常情况下呢,我们啊代码它有一个的机,一个base啊,这个大家还记得吧,那有这个base再加上的啊,然后呢,才是真正要执行的位置,那么正常情况下啊,我们这个我们这个汇编程序要从什么地方开始执行呢?要从base啊加上什么呢?Off啊,零的位置啊,也就是说什么呢,从这个代码段这个机址开始加零的位置开始执行啊就这么一个东西,那么我们怎么去找到这个地方呢?啊,那我们就要首先啊,给这个代码起个名,用一个做as字啊,然后呢,你C行称一个,然后后边的名称你随意,你愿意写什么写什么,比如说我现在呢,我就要写一个code,或者说或者说这个,呃,Code segment啊都行啊。
14:31
那我现在呢,就写一个code,那意思就什么呢?就是意思,意思就是我之后啊用了这个叫做code的啊,也就是叫做code s啊,那就是的个我这里开始写的代码,就是代码段的起始位置啊,下边的第一行就是从这个代码段零开始的啊,但是注意点什么呢?你这个代码段要有头有尾啊,就有一个地方你要给写一个尾叫什么呢?叫做code啊,这个结束S啊结束的意思,代码从中间写,然后呢,整个汇编呢,它因为一个格式要求你最后一个啊,就是结束的意思啊,那么还有一个问题就是什么呢?就是我们现在这个格式是通配的吗?就是说我们现在学的是16位会编啊,肯定是这么写了,那32位和64位也是这么写嘛,啊,大家告诉大家一下不是啊,我们。
15:31
16位汇编只是16位的写法,32位它有32位的格式,64位有64位的格式,其中最复杂的是32位,最简单的十六十四位啊,16位还好居中啊,这个呢,我们在后续过程中呢,系列课里都会学到啊,那今天呢,只是来讲16位的啊,32位和64位,我们往后,那我现在呢,就开始可以写我的第一行代码了,但是有一个问题,如果我现在直接这么写,而不会不来,不给他加一个什么呢?不给他加一个退出啊,以汇编来说,他是没有办法正常退出的,你像你如果学习的是高级语言啊,高级语言呢,会给你提供一个退出的安全退出的一个东西啊,比如说你如果是一个这个啊高级你写一个啊,它虽然说在你的这个高级元的函数里啥也没有给你写,但是实际上在底层也是帮你实现了一个退出,那像是16位我们想要安全退出一个程序呢,你要怎么做呢?你要调用一个叫做中。
16:31
断的东西啊,叫调用一个叫做中断的东西,中断这个东西呢,我们现在还没有学啊,你可以了解,你可以理解为中断就是一个过程,是一个方法,是一个函数,无论你能怎么理解,你就理解为它是一个代码段的一个集合,这个代码段是干什么使的呢?就是帮助你安全的退出你的一个汇编程序,那么我们现在要调用的这个中是什么呢?是21号中啊,21号中我后边为什么要加个呢?因为这个H代表着它是一个16进制数啊,16进制数。
17:05
这个能翻译成什么指令,它就成什么指令,那在这个位置上我写一个它就是什么,它的功能就是调用某一个号的中啊,那这个呢,就是我调用了21号的中段,那么在我们Windows里呢,通常情况下我们的中段是保这个在保存到什么呢?保存到一个叫做I的功能不。
18:06
价是一个函数啊,那比如说我现在调用一号中断是一个功能,二号功中断是一个功能,三号中断是一个功能,那这个时候来了啊,经典来了啊,我三号中大家以后会经常到什么意思呢?我们所有的这个断点啊,包括我们V提供的,我们调试器供的软点,实际上而就是什么呢?就是这个IN3啊,就是这个IN3,那三这个就是什么呢?就是既然它是提供了一个软件断点的一个回调啊,或者说是一个方法,一个功能,那么这个东西它在汇编里是不是在这个硬编码里啊,因为我们说了啊,我们这个汇编语言都是直接一对一翻译的这个这个编码,那我们的编码里是什么呢?C啊,0C16进制C啊,当这个C啊,无论任何的这个汇编器反编器,它都会帮你翻译成INT3啊,这个一般一般情况下啊,不会有什么奇怪的这个翻译翻译出现啊,正常都能正常正确翻译啊。
19:06
所以说啊,这个意思就是啊,中断是什么?大家有一个简单的了解,那我们调用这个中段的时候,有时候需要参数,有时候不需要参数,那么刚好我们的21号中断呢?啊,如果你想要实现的是一个退出的功能,那你需要给他传一个参数,那要参数放在哪儿呢?啊,大家记不记得我们上节课说过一个概念,叫做寄存器,寄存器是什么?寄存器就是由多个触发器堆叠而成的存储端单位,一个触发器一个这个啊,像我AA是16位通用寄存器,那么就代表着它起码有16个触发器,这16个触发器上边有16个锁存,每一个锁能保持能保存一位数啊,那也就是说我们的AX能保存16位数,16个一啊,16个一啊,那我们现在呢?
20:06
如果要把它里边放东西啊,调用一个什么指令呢?调用一个指令moa指令啊,然后呢,它的操作方法是怎么样的呢?一个move加上你要想把东西放到哪儿,然后呢,加上一个逗号,后边呢放你要给他的值,比如说我现在呢,我要正确推出,我需要给他传一个400啊,就是400啊,然后H16进制啊这样的一个数啊,然后给它放到A里,我现在呢,就要经过目指令给它传进去啊,目指令是什么意思呢?数据传送指令啊,数据传送指令我们现在呢,打开我们的一个小软件啊,叫汇编金手指这个东西,如果你们需要也需要联系一下我们的助理啊,首先我们直接可以在这这儿看到木啊也可以,你直接在这搜一下也行啊,也可以搜啊,然后呢,我们来这个搜索一下啊,你可以看到就出来了啊,就是目目功能是什么呢?功能就是本指令将一个原操作数啊送到目的操作数中啊也就是说。
21:06
是什么呢?也就是说我们的二个啊,这个O这个东西呢,就是所谓的这个操作数,这个O就是所谓的目的操作,是把一个目的作以了,那我们现在这个目的操作A寄存器啊,然后这这边呢,放的是一个立即数,什么叫立即数呢?所有的啊,这个数字它直接直接写的,而是不是以什么寄存器啊,不是以什么内存来表达的,这种数字都叫做立即数啊,那底下呢,也给你说明了一下啊,它两个参数都可以是什么东西啊,那你首先哪的这个目的操作数可以是寄存器,可以是存储器,也可以是累加器,都没有问题,但是它的第二个啊,这个可以多一项,为什么呢?因为你可以看到它多的一项是立记数啊,我给大家解释一下,为什么会出现这种情况,就是说如果说啊,你现在这么写没有问题,把一个4700。
22:06
放到一个16位的一个寄存器里,它有16个触发器里头的锁存是可以存储这个数的,这个是没有问题的,但是如果说你在前边,你比如说你现在写了一个一,然后呢是一个AX,那么这时候问题出现了,你这个一怎么存AX里的东西,他没有办法存,所以说呢,它的目的操作数是,呃呃,等会儿啊,它的这个目的操作数是没有办法啊,是立即数的,但是它的原操作数是可以是立即数的啊,这个就是它第一个啊,第一个参数不能是这什么呢?不能是立即数的一个原因啊。呃,然后呢,我们现在呢,就可以来看一下东西啊,这儿还有一条指令,一条说明啊,就专门的说明上面这些呢,都是告诉你它能怎么使用,比如说可以从这个寄存器到寄存器,也可以从利计数到寄存器,也可以从通用寄存器到这个什么其他的东西啊,什么还可以什么是内存啊之类的,但是注意点啊,它不影响这个标志啊标志啊,那什么是标志呢?这是我们后边要学的一个东西,就是一个这个FLAG32呢叫啊,然后十它是一个标器啊,它呢这个标是什么意思呢?就是你使用一些功能的时候啊,他帮你存储一些状态啊状态,那我们这节课呢,因为用不上,我们先不说啊,我们之后呢,去了解这个东西啊,然后呢,你看一下我们的21号中断之类的,你其实可以在这看啊,它有些常用的伪操作,这我们后边学,然后你看这还有什么,这个DOS看到没有,还有DOS的一些这个功能调用。
23:45
然后呢,还有一些这个biOS的一个中断的这个功能调用啊,你比如说我们现在它这个是呃,Int中断的一个ah功能号,我看一下现在我们是十号中断,那我们应该有这个,嗯,我没看到啊。
24:04
啊,但是你可以看到它前边呢,有一个调用参数会告诉你啊,给它放在什么里边啊,你比如说你要设置的是DH寄存器啊,还是DH计算器,还是DL寄存器,还是什么什么样的东西啊,这在把参数放在哪儿,它这个中断里头呢,是给你显示的,给你指定好了啊,还给你指定好了,然后呢,你这个就根据他的这个东西来一个存放就可以了啊。我们后边呢,也会对这个中啊来进行一个讲解,那现在呢,我们先来了解一下啊,就是我们这个状态上啊,其实基本上就已经可以了啊,就没有问题了,这个东西就能用了,那我们现在呢,来给他这个放到我们的虚拟机里,我们简单尝试一下啊。我们给它放到这个跟这个汇编器同一个目录下啊,这样比较好用啊,但是你看它r k asm文件,它没有后缀怎么办?工具文件夹选项查看啊,然后把它呢这呢隐藏已知文件的类型名这个扩展名这个选项勾掉啊应用,然后呢确定。
25:07
卡住了,稍等。好,你看它asm就出来了啊,这时候呢,我们点开始,点运行,我们输入CMD,然后点确定,它这个命令行就出来了,那我们现在呢,就要用这个Windows的一些操作指令进入到这个文件夹内啊,那我们现在呢,如果直接把它放在桌面上呢,它路径比较长,还有中文啊,不太方便啊,那我们怎么办?直接啊把它剪切放到我们的这个C盘跟目录下啊,这样路径它比较短啊,那么现在CDCD就是进入某文件夹,我们首先进入什么呢?C冒号反斜盖啊,我们现在先进入到C盘,我们一个Di显示当前驱动下的一些目录,你可以看到啊,包括一些我们的这些Windows啊什么的,你以看到在这都有显示啊,还有什么file啊什么的,MMAM都有啊,然后下一步再进去啊,CDMAM啊,然后呢,我们直接点进入,现在呢我们就进入到mam下了,进入之后呢,你可以看到就是这几个文件啊,这个什么link isml啊,还有这个RK啊,现在呢,我要调用的呢是ML这个啊,我就不需要给。
26:17
这个中文件再给生成这个文件啊,我直接用ML这个流程就行了,你可以输入ML,也可以输入ML点,然后呢,再加的东西有LINK2个,Link的一个警告啊,都是这个warning啊,只要是不是这个A,我们在编程的时候看见警告就是没有看见啊,无所谓啊,跟没看见一样,当然了这个驱动变成的时候不行啊,驱动有时候会把警告这个设置为这个错误啊,那个需要特别配置,我们现在不需要,我们现在直接写就行,现在呢,我们可以看到啊这个东西啊,已经这个显示出来了啊,那么接下来我们在这儿是不是有一个EE就生成了啊,但是这个是一个16位的程序啊,注意它生成的是一个16位的程序啊,你那个使用这个32位的调数器是没有办法的,所以说呢,你如果要运行,你现在可以直接运行的,但是你调试不了,因为你。
27:17
叉P环境是兼容16位的,但是你的调试器是不兼容的,一会告诉大家怎么调试,那么现在呢,首先呢,我们啊,要想执行的,我们直接运行RK,点这个E你就不就不错啊,那如果你要调试它,你要输入什么呢?输入一个debug,然后呢, Rk.EE这样呢,就是调试的啊这个debug呢,是Windows提供给你的,是叉P里自带的,你也不需要去配置的,你直接用就行了,然后一回车啊,那么这个时候你就已经进入到调试状态了啊,你看它光标在闪烁,那比如说我现在输一个RR就是什么呢?就是显示寄存器相关啊,也显示当前条指令,那你可以看到我们现在呢啊,这个AX啊,什么S些通用存器都有显示,然后呢,什么这个d sess这个寄存器。
28:17
显示,然后IP啊,这个是IP器有显示,然后呢,我们这个位置这个010AE51,然后61D这是啥东啊,这个S址,然后这一是什么呢?1I啊所以说我们这个东西中间加的号是什么呢?是这个C这个零为然后加上IP一个成的一个地后呢,比如说你现在就可嘛呢一这个汇编代码,然后呢,你如果再摁一下这个什么这个T啊,T就是这个单步步入啊,然后T就是单步,不过啊这个呢,一会儿给大家解释一下,详情解释一下啊,就是什么叫做单步啊,这个P什么叫做P啊。
29:14
这个呢,我们现在还体现不出来,所以说呢,我们暂时不管呢,但是呢,你可以看到啊,我们现在好像出了一些问题,什么问题呢,就是我们为什么一开始的情况下,它就在哪儿了呢,我们的这个。100的位置上了,理论上而言,我们应该在段不段0A15的这个零的一个偏移上,对不对啊,但是我们现在直接到100的一个偏移上,很明显出现了问题,为什么呢?因为咱们这个代码的问题啊,他直接就执行飞了啊,就是没了啊,那所以说呢,我们要写一个这个有什么有一点含义的这个代码,然后才能让它住,比如说我们刚才说了啊,我们可以通过一个目指令给谁放赋值,那比如说我先给AX个四,然后呢,我再给这个BX个五。然后呢,我给这个S不是那个,呃,我再给这个CX啊个六,然后呢,再给DX我个七啊,我这样啊,我就有一点意义啊,有一点意义啊,然后呢,需要注意一点是什么呢?就是当这种16进制之数啊,你写的时候,如果是以数字开头,没有任何问题,如果是以字母开头啊,要在前面加个零,否则会不能正确识别啊,这是需要注意的一个点,好然后呢,我们再把这个东西复制,呃,复制到我们虚拟机内。
30:28
好,我们将那个中间文件和最踪的exe文件删除掉之后呢,我们来重新给它进行一个这个运行啊,我直接输入够啊,然后就运行起来退出了,那么现在呢,我就干嘛呢,我来直接啊来给它这个ML啊,这个 Rk.asm啊,然后呢,它就生成好了,生成好之后呢,我现在呢继续啊用debug啊来这个执行它EE,好我现在R啊,R完之后你可以看到我现在位置是不是在0B3D0000啊,然后它的这个自检码是B80400啊,然后它的功能呢,是木AX0004啊,那么这个就可以简单给大家解释一下啊,我看我们看一下它是为什么会是这种状态,那么大家首先啊,他上节课是不是给大家解释了一个硬白码的一个状态啊,那我们现在首先了解一下这个B8啊0400是一个怎么回事,那么首先我们看啊的B8肯定是什么,是指令啊肯定是指令,那B8是什么呀?B8相当于什么呢?A啊就是把A。
31:29
把这个一个值放到这个A,这个是B8功能,那040,我们这边会明明是个零,它是这个啊0400啊,这个呢,就说到上节课我们讲过的一个东西,叫做这个小端续啊,小端续啊,因为小端续,所以他在内存里形这个0004,在内存里形成了一个0400这个状态啊,这个呢我就不再细说了,因为咱们昨天讲过,如果对这个小端有疑问呢,可以回去找小助理啊,要一下录播啊,看一下昨天的内容。
32:02
好,那我们现在呢,已经知道了啊,这个呢,我们就是第一条啊,那我们现在来看一下,我们的AX是零,BX0 C11啊,D是零,那么这个时候我比如说我现在呢,摁一下这个T啊,我走一步,走一步之后呢,你可以看到AX已经变成四了,这是为什么呢?因为我们在第一行指令上木AX啊,我们把为AX已经通过指令设成式了,然后下一行指令呢,你看是什么呢?是木B5,那我再按T啊运行,你看它走的是什么呢?这个我的BX就变成五了,然后再下一步呢,我会把CX成六啊,注意11诶,你看是瞬间变六了,11变六了啊设置好了再走一步啊,你看DX啊就变成七了,现在呢,把这个这个as要篡改成4700了,我们出的代码啊,你看那现在呢,这个as变成4700了,然后我在这要调用什么呢?T21这这块记住千万别摁T,要摁P啊,这个是一个区别啊,我们要P啊,然后呢,它会正常的退出,如果你摁了T啊,那你这就出事了啊,你看啊,再摁一下P我就退出了。
33:03
那这个呢,就是我们的一个程序的一个正常的一个跑完了啊,我们看到他修改了我们里边的一些寄存器的一个值啊,也正确的退出了啊,都没有问题,然后呢,我们现在呢,就要来了解一下我们的T和P到底有什么区别,那要聊到他们的区别,我们就必须要知道一个东西叫做函数或者叫做过程啊,假如果学过Java之类的高级语言,你可能知道叫它叫方法,那在汇编里怎么写呢?啊,这个东西无论你是方法还是函数还是过程啊,你这个东西都要写在code c这个segment里,就是在写在你的CS段里,怎么写呢?比如说我现在有一个叫做这个RK的一个函数啊,一个功能啊,然后呢,或者或者说我现在不叫RK,我叫这个set AX啊,我这个功能呢,就是设置一下我AX一个值,那我这个呢,不需要参数,我直接写一个PROC啊,这个PROC的关键字代表着我的这个set AX是一个什么呢?是一个函数,然后呢,我用这个再来一个这个set a这个。
34:03
啊,然后NP结束这个数啊,中间写的代码就是属于这个函数的代码了,啊,就是属于这个函数的代码了。然后呢,我们现在呢,就在里头写一个功能,比如说我们现在写的是这个AX设置A值,那我就可以干嘛呢,我直接啊一个A我给设成一啊是不是没问题,然后呢,我现在呢,两个问题,一个是我如进这边一个我行,我如何出。直接call他的名字啊,那这个时候你可能会问了啊,为什么我这样呢,就没有问题了呢?因为什么呢?因为我们这个call相当于什么呢?相当于我们把我们下一条指令的地址就是这个目AX这条指令啊,我假设它这有一个地址就十,那我就把这个下一条指令的地址放到哪儿呢?放到我们的IPIP大家记得吧,指令指指向我们一条啊啊说错了,不好意思,那个我们就把它放到站里边啊,我们这个啊,我们就了个站里边啊,那这呢站是个什么概念呢?我们来简单说一下啊,那是退出的流程啊,我刚才说了那个占的这个过程啊,我们这个东西相当于一段空间啊,每一个格都能保存一一点东西啊,那比如说呢,我现在呢,我这有一个这个Excel。
35:40
这个Excel呢,大概呢,我这个站呢,就长这个样子啊,这个样子有一些单元啊,每一个单元呢,我都是干嘛呢,有一定指定大小的,你比如说我这个大小取决于什么呢?大小取决于你当前的系统位数,比如说你现在16位系统,那你这一个单元里只能存储16位的一个数据啊以16位的一个数据,然后呢,它这里呢,分别有这个指针,这个BP啊占指针啊,这个啊用来管理啊,然后呢,如果你往里头压一个东西呢,你要调用一个指令叫做什么呢?叫做push,然后呢,如果你要弹出一个东西呢,叫做pop啊,他们这个东西呢,Push呢,你后边呢,可以跟立记数,可以跟内存,也可以跟这个计存什么都行,然后呢,你这个东西压进去之后啊,然后呢,它这里边的值就会压一个进来,然后呢,它的这个SP的高度啊,就会减,减去这个16位啊减二啊,注意它是减不是加啊不是加当。
36:41
你泡的时啊,泡的候你才是加啊加二啊,因为它是16位,所以是加二,这二呢是两字节,每一个字节占八位啊占八位,一个字节八位,然后呢,用他们俩来操作,这两个呢,我们现在呢,我们只要我们根据这个BP西存到我们的站里边了。
37:14
啊,存到我们站里边了,然后这个时候呢,我们不是已经这个存进去了嘛,然后呢,我们再啊通过一定的这个方法进行跳转,跳转到哪呢?跳转到我的这个函数的这个位置上,这条指令上,这条指令呢,其实就是相当于我这个函数的这个起始位置啊我现在呢,就进入到这了,进入到这之后呢,我就正常的执行它,执行完之后呢,干嘛呢?我这有一个re,就是能帮助你回的一个这个关键所在,它是为什么可以回去呢?是因为你在进来的时候,你把一个这个下,你把这行的一个地址已经放到站里保存起来了,那你在回去的时候,你可以干嘛呢?你可以进行一个泡泡,把什么呢?把你这个站顶啊,也就是现在这个顶上的这个位置啊,给它这个保存的下一行的地址弹出,弹出到哪呢?你进行一个pop IP啊16位就是IPIP把这个地址放到IP里,然后呢,你再。
38:15
啊,你再跳过去啊,就完成了你这个返回的这么一个工作啊,这个就是函数的进与出啊,至于它是怎么跳的,这是有一个专门的指令,叫做这个G指令,但是我们现在先不想那么多,我们知道我们是跳的就行了,怎么跳后续再说。然后呢,我们就理解了,我们是如何进去如何出来的啊,那么但是又出现一个问题,我们如果这么写代码的话,那么我们的这个,因为它这个S是线的啊,第执行,也就是说我们的A会成这个code,这个S,那么这种情况下呢,那它的执行顺序就跟我们想的就不一样了,那么这个时候我们需要干嘛呢?我们需要特殊的指定它的起始位置在哪,比如说我想让他从这个call开始这个执行,那我就要给他来写一个start冒号,然后呢,这个时候啊,他就会从这个开始执行,那在哪结束呢?啊,在这你在这个后边要给它上一个啊,这样它才能正常结束。好那么我们加上这些东西之后,我们再来重新给成一下,我们复制到我们的虚拟机里。
39:41
好,我们调用ML啊,然后 Rk.asm好,现在N,我看一下是不是有。这个东西弹的有点多啊。啊没有啊没有啊,没有error啊,然后呢,我们现在呢,来这个debug啊debug啊,我们的 Rk.e点点点错了,RKSM了,我直接购过去算了。
40:04
啊,飞了,我直接关掉得了。点错了,我把这个文本给执行起来。好关掉了啊,我们重新运行一下它的这个命令行。好,现在没问题了啊,然后呢,我们现在呢,给他ML啊,嗯,不是ML啊debug啊,Debug它是 Rk.exe啊好,现在没问题,我们先输入R,你可以看到我们现在呢,在什么位置上,在这个0B,也就是CS啊CS的位置上,那也就是什么呢?你看它这个代码零零对不对,我们这个SAX的什么位置,到是我们第一行代码,这个函数函数第一行代码对不对,这个代码它实际上就是位于我们segment啊code sment的零的位置上,所以说它这里01点问题都没有,我们只是把这个启动地址设置到了零四的这条地址这条代码上啊,设置到这儿了,所以他才会这个在这个位置上直接给它进行一个call啊。
41:31
然后现在呢,我们可以干嘛呢?我们可以干两件事儿啊,我们现在呢就来分别就能分辨出来什么叫单步步入和单步不过了啊,单步步入。就是T不是对,就是T啊,单步不过啊就是什么呢。我的步步啊,步过就是T啊,这两条指令,单步步入的意思就是我在这儿,如果我说啊,我按了T啊,我要步入啊,啊我刚才说到哪了,就先说步入吧,我如果要步入,那么此时此刻我就会直接到里边来一行一行的执行啊,这就是T的作用,它会进入到里边,那如果说我摁的是P,它就不进入到里边,直接行到它的返回啊,行到这个A,这这就是P啊,它就是单步步入和颁步,不过啊,它的区别就是进不到进步,进入到靠内部执行。
42:26
进去我一下T看行,你看注意这个摁完P之后,你可以看到它就返回了,看到没有就返回到下一行了啊,然后呢,正常你愿意摁P摁P,愿意摁pnp,它就继续去执行下去了,那这个呢,就是什么呢?这个呢就是它它的这个函数功能的这个作用,那比如说我们现在我如果你觉得啊,它这个函数功能不够屌啊,那你还可干嘛嘛呢,把这个部分start部分啊,你也给封装起来,直接封装成一个call,然后你把这个start call某某某啊,就是相当于出一个main函数,那么跳过去也没有问题啊。
43:16
好,那这个呢,就是咱们今天的这个技术部分的全部内容啊,现在呢,如果有问题呢,你们就问啊,没有问题呢,咱们就该换人了。如果需要这个工具啊呃,代码啊,什么乱七八糟的东西的,你就要需要加咱们小助理啊。
44:04
叫我让哈,对叫你的,我看看他说步入的话,会进入到这个函数内部啊对,是的,步入就是进入到函数内部,如果不过的话呢,就是直接执行到函数返回的下一条指令两个呗。嗯。来,红对梦同学听懂了,敲个一。还有其他同学有问题吗?可以录你手机给我,现在搞的全是噪音。打抖了。还有问题吗?没有问题我就撤了啊,就换人了。我感觉他们没问题的,我这个结束一下录制。
45:02
然后把你的那个关一。
我来说两句