00:00
今天呢,咱们开始讲这个32位的汇编了啊,然后呢,环境呢,也就不再需要这个虚拟机了啊,我们直接从这个本机上开始进行开发,那我们使用的这个工具呢,是我们微软的这个宇宙最强ID啊,就是这个威斯九九啊,我使用的是2017版本,嗯,你可以使用2013 2015 20222019啊,这几个版本都可以啊,太新的就不建议了,然后太老的也不建议啊,像什么二零那个一零啊零八啊之类的就不太好啊,当然你要用呢,也不是不能用啊,也都能用。他这个玩意儿呢,是你可以去这个他的官网上下载啊。What?咋拼呢,我?啊,直接复制啊。Studio啊,然后他应该有一个咱们的百度,它这个东西广告属实有点多啊。
01:05
给你们找一下啊,这这应该是它这有一个with studio的一个网址of,应该没应该不是假的,然后呢,你可以看到它最新版本呢,已经到了这个STUDIO2022了,然后呢,我们一般情况下不用这么新的啊,我们一般情况下用这个稍老一点,它这个应该有是是有一个这个历史版本的,嗯。这历史版本在哪,我看一下啊。比较完美。啊,这不是这个是他的三个版本啊,就是他这不是有一个这个社区,有一个专业和有一个那个企业嘛,这其实这个你用哪个版本都行啊,你像是这个社区版它就是免费的啊,然后专业版和企业版的它就是收费版本,当然了,你要是去网上找key也都能找着了啊,但是社区版的也够你用了啊,正常情况下也够你用了,然后呢,这边呢,你可以去找一下他这个东西历史版本去哪了呢?呃,我看一下啊。
02:03
了解更多。啊,这都是2022的啊,这个没没找着他这个下载,它这个历史版本在哪,它应该是有历史版本。嗯,没找到,没找到的话,咱们从网上再搜一下,比如说这个2017啊下载。啊,MICROSOFT2017啊,尽量不要在这种软件园啊,什么乱七八糟的东西上去下载啊,你这啊你看这儿呢,这就是它的这个历史版本啊,包括它最老的是在2012版本,2013 2015 2017和2019啊,我用的是2017,我建议你用2015或者217都行,2019呢,稍微新了一点啊,然后但是现在也兼容的比较好了,你像这2022呢,就建议不要用啊,那这个呢,就是在这儿下载,下载完之后之后呢,你这个给它正常安装啊,经典安装就行了,安装完之后呢,它就会有这么一个东西啊,你双击运行它啊注意一点是什么呢?就是你这边呢,你安装完这个visual studio之后,你需要注意点啥呢?就是visual studio它装完之后啊,它正常情况下它有几个东西啊呃,你要开的呢,是这个直接叫做STUDIO201的这个东西啊,那你开它其他的,你比如说开这个啊,它显示的东西会跟我这个有点不一样啊,那个你可能看着就比较晕啊好,那么接着呢,我们可以看到这就是它这个启动之后的一个窗口啊,然后窗口。
03:26
啊,就是大致就这么一多东西啊,像什么开发者新闻呢,我最近开发的项目啊,还有这个新店的一些快捷方式啊,就是比如说我经常用的什么动态链接库啊,空项目MFC啊,或者静态库动态库这种东西,那这边呢是打开啊,打开一些这个我们的文件夹啊,解决方案项目啊什么的啊,这边呢是入门的一些教程啊,这边呢是解决方案资源管理器类视图什么的啊,这边呢,你现在用不着,一会儿打开项目之后你就用着了,这边是起始页,上边呢这是工具条啊,这边呢,包括这个附加呀,还有这后边这个现在按不了这个空啊,都是这个一会儿打开之后用的啊,这边还有一个登录是登录你的这个微软账号啊,或者说叫v studio账号也行,然后这边呢,还有一些这个服务管理器啊,这边工具箱啥的啊,这个我们现在用不到,我们后边会用,那如果说你想要给他进行一个正常的激活的情况下呢,你就在这帮助啊,点击一下这个注册产品啊,然后在这儿激活就行了,我这个呢,就已经是这个给他激活完了的啊,使用一个密钥来进行激活的,呃,其他东西呢,我们在后续的学习。
04:26
中用到什么,来这个研究什么啊,其他东西你就不需要太多的了解,我们现在要写这个项目呢,就不需要像是我们16位汇编人一样,直接用这个记事本来写了,我们就可以用这个IDE啊,它是个比较好的一个东西,我们首先新建啊,新建一个项目。文件左上角文件新建项目,它弹出这么一个状态啊,这是我这个这个版本啊,如果它是2015,它跟我这个版本状态差不多,如果是2019啊,它这个东西呢,变化比较大,它在这儿有一个这个搜索栏应该啊,然后你你就去找啊,找什么呢?找你的这个C加的一个这个空项目啊控制台应用或者说是空项目啊,正常情况下呢,我建议你创建空项目,否则呢,可能会出现一些意外的错误,呃,然后呢,比如说我现在呢,我这来一个这个a asm01啊,然后呢,我现在就是起的它的项目名底下这个位置呢,就是你这个项目啊,你这个东西啊,它会生成一些配置文件啊,项目还有一些资源之后会用到的啊,都会生成在一个文件夹里啊,比如说我现在,我现在去这个文件夹里大家看一下。
05:30
就是我们默认啊,这是默认的这个位置啊,当然你放到其他位置也无所谓,比如说我这儿随便找一个这个东西,你可以看到这个是什么,这个就是它的启动文件,然后这个文件夹里边呢,放的就是你的源码之类的东西,这个re资源啊,然后呢,这上面的这个debug的一些这个配置啊,然后呢,但是真正的这个生成的文件呢,在它上一级目录的这个debug里啊,你可以看到,然后呢,还有这个点VS里也是一些这个配置类文件啊,就是这个意思,这个东西呢,你可以自己选啊,也可以这个放在哪,然后它的解决方案名称啊,可以正常情况下呢,跟你的项目名称呢是一样的,如果不一样呢,你也可以自己进行一个设置,然后呢,这儿呢是为解决方案创建一个目录啊,就是创建一个目录,你可以看到它的两级同名嘛,它其实就是一级是解决方案,一级是我们的项目啊,一个解决方案里是可以有多个项目的啊,然后呢,底下呢,还有这个添加的源代码管理啊,因为我们是搞这个安全的啊,不是搞开发的啊,否则这个源代码管理也是一个很好的东西,但现在我们是不需要的,然后接着呢,我们就可以点击确定啊,然后呢,现在他就会给你创建出一个。
06:31
呃,没有任何东西啊,帮助你生成的这么一个项目啊,这个项目就是我们现在要写的这个项目了,然后呢,我们现在呢,在这个上面是解决方案,这个是项目,我们的项目上右键属性啊,然后干什么呢?然后给他来这个,呃,在这个我想想啊,我想我刚想干什么啊,对,在这个常规里边啊,我们直接把它的平台工具集啊,我们给它设置成这个2015的这个V140,之所以用这个2015来这个进行使用,是因为我们有一些比较好用的库啊,它在205之2015之后取消了啊,就2017里没有这个lab了,所以说呢,我们要用它的2015来进行一些编程,所以说我们换成2015倒不是因为其他什么原因啊,点击确定,确定之后呢,我们在这儿原文件啊,我们正常情况下应该直接新建啊一个文件啊,但是因为我们啊,对啊是直播呀,当然是直播,呃,我们这个东西呢,因为我们这个文件里边啊,我们正常情况下创建里是没有asm文件的啊,我们可以看一下啊,我们右键属性这个新建新建项啊,你可以看到有头文件有这个。
07:31
加文件CP有下加类啊,然后这有这个包啊,然后还有一些其他的一些东西,但是你可以看到没有我们汇编的文件啊,上节课呢,我们也说过了,我们的这个汇编文件呢,它的后制名是一个asm啊,所以说呢,这个东西呢,需要我们自己给他创建,但是呢,我们最好是什么呢?我们最好是先给他配置一下,再给他创建,就是在他的这个项目上啊,然后呢,我们右键啊给它设置一下什么呢?设置一下它的生成依赖项,点击生成自定义,然后这儿呢,有一个msm啊,勾选上点击确定啊,然后有需要一些工具啊,比如咱们之前的课啊工具啊之类乱七八糟东西的啊,你可以联系一下咱们评论区的小助理啊,然后可以直接私聊啊,要他跟他要群号啊,要资源啊,要视频啊,要工具啊之类东西,反正你就找助理就完了啊,然后我们继续上课,我们给他生这个,把这个生成依赖项里的生成自定义勾选成这个ma SM之后啊,我们现在就可以给他创建这个as文件了,但是注意啊,注意有些同学呢,这个之前我这个遇见好好多同学,他这个可能是眼的问题啊,他把这个勾选。
08:31
上面这个了,你上面是什么东西啊,这是m asm啊,这个ARM是ARM架构的ma啊,底下这是m asm啊,这个Microsoft的asm啊,和这个Microsoft ARM asm它不是一个东西啊,你要勾选这个m asm中间没有ARM这个啊,点击确定啊好,然后呢,我们在原文件这啊,我们给它添加一个新建项。嗯,QT去写相关汇编可以吗?可以啊,没有问题啊,这个QT和MC这个东西只是界面库啊,跟你底层写什么汇编,写C加加都没什么关系啊,然后呢,我们在这儿啊给他啊选什么,选任意啊任意为什么,反正他没有SM,所以你选什么都行啊,那我们在这儿给他写一个入口,你可以写一个may,写一个entry啊,什么东西都行,看你个人习惯。
09:15
然后注意啊,点asm,我们手动给它写成asm,这样就可以了,点击添加,添加之后呢,它就形成形成了一个这个asm文件,现在你可以写代码了,但是注意你现在这个东西如果写完代码你也运行不起来,因为你没有入口点啊,就是相当于我们16位汇编的时候,你没有一个start啊,但16位汇编的时候你没有start,它还能从你的这个默认的这个代码的一个GS的一个起始位来进行执行,但是我们12不行,它遵守一定的规则,尤其是我们的这个studio,它这个规则更为严格一些啊,所以说呢,你在右键属性,然后呢,这个链接器里啊,你要设在这个高级里,设置一下它的这个入口点,比如你把入口点设置成may啊,这样是没有问题的啊,然后呢,我们直接点击应用,点击确定,这样呢,你就有一个叫做may的一个入口点了,啊,这个入口点的名字为什么叫may呢?它主要是跟这个高级语言一样,实际上而言,你写任意的名字都可以,比如说entry啊,瑞克威啊,这个may啊,甚至咩都可以啊,这都是无所谓的啊,啊什么都行啊,然后呢,我们现在呢,开始来写这个代码,我们16位的时候,它是有。
10:15
指定格式的啊,但是现诶。这手机咋又黑了呢?好啊,我给重新看一下啊,然后呢,我们来写啊,这个格式呢,我们刚我们之前最开始讲的时候就说过,我们16位的汇编,32位的汇编和64位汇编,它长得都不一样啊,那我们之前写的16位汇编是那种形式啊,比如说我们需要指定一下这个段啊,啊CS啊,给它指定成扣的啊,这个segment,然后segment这个start和segment end啊,那我们现在呢,就没有这些东西啊,虽然也有啊,但是它这个玩法就不一样了,那首先呢,我们在这个这个版本中啊,那我们要写最基础最基础的啊,我们也是要有一个这个呃点扣的。但是啊,我们在这个点扣之前呢,我们需要有一些修饰,什么修饰呢?啊,就首先你要指定他用了什么样的一个指令集,比如说啊,我们这个根据CPU的版本来说,我们有这个386486586啊这种这种这个汇编的这种指令的版本啊,我们是需要这个自己进行一个指令的,比如说我这点儿586啊586,那我这儿呢,就指定了一个586的一个指令集啊然后呢,指定完5686指定级之后呢,我们还需要指定一些东西啊,那这个东西呢是什么呢?就是一个点Mo啊DL这个语句,那这个东里边东西呢,我们首先呢是要指定啥呢?指定你的这个内存模式啊内存模式,那我们这儿呢,要指定两个东西啊,首先我们指定一个f lat啊,而lat这个东西呢,代表的是你的这个内存的这个使用方式啊,它呢是我们这个WIN32程序所使用的一种这个模式啊,我们这个代码和这个数据段使用的是同一个4G段也。
12:00
就是说我们的CS段和我们的DS段啊,使用的是同一个四级B段啊,是指的这个意思啊,我们在这儿使用一个l l lat啊进行一个指定,然后呢,我们这指定完这个CS和这个DS的使用同一块内存之后呢,我们接着呢,用一个我们后边还需要指定一个东西,就是什么呢?指定一个叫做这个调用约定的一个东西,那这个调用约定是个什么意思呢?首先呢,我们要了解一些这个调用约定的这个基础啊,那我们首先。啊,我们新建一个文本啊,来这个讲解一下,什么叫做调用约定啊,我们在前边的这个16位的这个时候啊,我们已经讲过了什么东西是一个函数,那么函数这个东西它存在一个问题,就是它的参数,如果通过push啊,也就是对战的形式啊,进行这个传参的时候啊,你需要自己给它进行评战,比如说你啊在16位的时候,你压进去一个参数,通常情况下是两字节啊,那这个给个啊就是把它平回来,那这个过程呢,实际上而言呢,就是遵从遵从的这个调用约定啊,那你像是我们正常情况下的这个调用约定啊,比较使用的比较多的呢,首先呢,是一个CD的一个调用约定,这个呢是正常情况下呢,是一个C语言啊,C语言常用的一个调用约定,它的是什么原则呢?它的原则是你自己压的东西,你自己把它平掉啊,就比如说你push哧push哧push哧push啊push了四个啊,你如果是16位,那四个那就是什么呢?那就是二四的八,那就八字节,那这。
13:30
字节在你调用完这个后,你自手AC2呢,WIN32是什么意思呢?WIN32就是我们这个Windows操作系统所给你提供的编程接口的一个啊,里边的一些东西啊,我们这个程接口通SSAA系统能然后然这统传系统功能,这些系统功能数意数这个。
14:30
滴d call啊,也叫标准的这个啊,那么还有什么呢?还有就是我们比较常用的就是一个叫做这个fast call啊,这个T快速调用约定的东西,快速调用约规定是什么意思呢?就是我们啊前面在16位的时候讲过一个东西叫做寄存器,那我们也知道我们16位的里头啊,它有这个八个通用寄存器,那这个通用寄存器呢啊,我们这个正常情况下呢,有这个几个有特殊作用的,比如说这个S啊,原击啊,这个S啊占啊,那这个ex啊,这个这个加啊,那我们在这个调用这个fast时呢,通常下呢个数个数就是两数,不论你这个函数有多少个参数,后边的不管后边依然使用对栈去push的,但是如果是前边两个参数啊,这两个参数是使用寄存器进行传参的啊,并且这两个寄存器呢是给写死的,如果是32位下呢,就是什么呢?就是一些XE啊,然后呢,这个呢,就是32位的情况啊,32位情况后边是对战,然后。
15:30
那如果它是64位的啊,64位是类似于发call的一个变异品种,那这种品种呢,它是什么样呢?它也是类似于叫发call,但是呢,它的前四个啊,四个器啊,它是四个器就是RR,那么除了这几个之外呢,我们如果了加之后呢,你还要知道一种叫做这个disc call啊,它是这个给下加这个传递Dis人用的一种这个方式啊,那这些呢,就是常用的一些这个函数调用约定啊,在后续的过程中,我们正常情况下呢,用的这个调用约定呢,就也是这么多啊,然后呢,我们啊,有了这么多之后呢,我们就可以来这个了解了啊,了解我们后续了。
16:12
后续呢,我们已经知道这些东西之后呢,我们在我们这个编程过程中呢,就开始来激励他进行一个指定,就是指定我们的调约定啊,现在呢,我们就因为我们也要使用一些这个API之类的东西,那我们现在呢,就把它的定位约定指定成这个std call。啊,我们指定成SD就可以了啊,那现在呢,我们就指定完两个东西了啊,一个是我们的内存模式,一个是S啊,那指定完这个内存模式和ST之后呢,我们要指定下一个东西啊,就是我们要指定一个这个option。Op这个东西呢,它是这个啊,我忘加点了啊,点option啊,这些东西都要加点啊,Op这个东西呢,是要指定什么东西呢?就是在我们的这个WIN32汇编中啊,我们只需要定义一个东西就是什么呢?就是啊这个参数,它的这个语义,语义程序中的变量名和指程序小二AA小定它区分大小写的时候,他可能会问出现问题,比如说他一个大A一个小A,那这个东西它就不一样啊,你知道吧,他这个不认啊,那现在呢,我要我就要给它区分开啊,区分大小写啊。
17:28
啊,我是徐帅啊对。啥来着?啊,应该是谢谢K麦,嗯。对,Option k map啊,这个应该没错啊,这个不知道为什么没有高亮啊啊对了,顺便说一下高亮的问题啊,这个高亮是自己装的啊,你在这个工具啊,然后里边有一个叫做呃,应该是自定义啊,啊不是自定义,我看一下啊工具,然后外部工具啊,对外部诶也不是我操那是什么东西来着,它里头有一个那个包管里的。
18:04
嗯,我们看一下啊,它应该是选项,也不是选项在什么东西里头来的,应该是工具里的扩展与更新啊,对扩展与更新。快张语更新里边啊,然后你搜一个叫做那个asm do的一个的一个东西啊,然后你把这个东西装上去,它就有这个汇编高亮了啊,就是这个插件啊,把它装上就行了,好,然后我们接着写啊,我们这个指定完它这个上面这些东西之后呢,那我们接下来呢,还是要指定一些段相关的东西啊,那也像是我们在前面这个学习中啊,我们用的最常用的两个段啊,是这个数据段和代码段,那我们在这边呢,实际上也是数据段和代码端用的最多啊,也就是一个啊data段啊,一个data段和一个我们的这个code。啊,那我们data段呢,我们直接写一个头啊,那我们扣的段呢,我们还要写个尾啊,直接一个end啊,它这个不像那个我们16位的时候啊,我们一个segment后边还要跟一个啊,那现在呢,我们不需要跟这些东西,那我们现在呢,已经就是有了它的一个基础的一个框架,那现在呢就要往里填充代码了,比如说啊,我现在呢,刚才指定了我的这个代码端的起始位置是在我们的这个may函数上,它是相当于一个入口点,那我现在呢要写一个may啊,PRC啊,这个是一个函数没问题,跟16位时候没有什么区别,然后呢,你在底下啊,要跟一个什么呢?May n的P啊,这就是一个函数的一个开始和结束,然后呢,你在里边呢,就可以来写一些代码了,比如说我现在呢,首先给他一个木啊,一个这个呃AX呃不是EAX,然后呢,给他一个一啊,然后呢,木这个EBX啊,然后给一个二啊,那我们一下看能。
19:44
嗯,失败了啊,这儿有一个错误啊,这个点open n,等会我看一下啊。他说我第三行有一个错误,是open上的错误。MY,哎,不对,是是这个。
20:01
NNE。Kisslap option。OPTION。哎,这有什么问题吗?啊,这个点好像有问题。我复制一个看看啊,看是不是这个点的问题啊,我重新生成一下。也不是。嗯,这个点是啥毛病呢,Option map on啊,这个中间不对。他给我报错就这个点,我操我看一下啊,逗号没有问题,Mo的586FRA。
21:00
S TD call这里头应该是没有写错的东西啊,它不需要点这个open是不需要点的啊,我想起来了,对对对,Open不需要点,所以他报错了啊,我们重新生成好成功了,然后呢,成功之后呢,这个东西运行肯定是一闪而过啊,因为我没有任何暂停的东西啊,你看它这个一闪而过了啊,然后呢,因为它没有这个退出的代码,所以说呢,他这会在退出的时候遇到一些小问题啊,如果你想正常退出,你比如说你可以给他return一下啊什么的啊,那我们这样呢,应该呢就诶他也有问题啊,那我们还是要调用API退出啊好,那么我们接下来呢,我们看一下啊,我们如果说我们想要调试它啊,那相对而言呢,它比16位而言呢,是更为舒适一些的,因为呢,它就具备了调试功能,什么叫做调试功能呢?首先呢,比如说我们这个在这个studio里边,你可以下一个断点,下个断点之后呢,你直接运行啊运行你看啊,它就正常的情况下,它就断在这儿了啊,断在这儿之后呢,它右边呢,就会显示出一些寄存器,那这个寄存器如果你这个正常情况下运行的时候,它没有的情况下,你就在这儿调试点窗口啊,然后它。
22:01
这里边有这个什么内存啊,反应回编啊存器这些东西啊,你点了它就出来了,然后这个寄存器呢,也不是只有通用寄存器,你可以右键啊,你比如说它有这个CS段啊个CPU啊,你看这就出来了,然后呢,你再给加浮点啊,你浮器就出来了,现在没浮浮取消,然后呢,我们这个啊,再看一下这个标志均匀器,这里这个几个呢,其实就是这个flag里边的那些东西啊,但是它跟我们的这个调试器的那个通常情况下的叫做名字呢,它不太一样啊,不太一样,但是这个大差不差啊,也还也还好也还好,那现在呢,我们啊看啊我们这个,比如说我现在呢,要目这个ES给他附一个一啊,你看我们这边啊,就可以直接的观察它ES的一个内容啊,并且它的颜色是会变的,我们直接啊按F10啊,F10是下一步啊,你看它就被变成一了,然后它就变成这个红色的了啊,然后呢,底下的EIP也变化了,为什么EI也变化了,因为我们这个EIP呢,就相当于16位的一个IP啊,它这个几个通用计算器,你可以看到它其实名字跟原来还是这个比较。
23:01
的这个efl呢,实际上是e flagx净音器啊,就是从这个f flag啊变成e flag啊,它实际上就是变成了32位的,那下面通用净音器呢,也就是进行了一个扩展啊,从这个AX前面加了个EAEAX是什么意思呢?EAX就是一个32通器,它的16是AX再啊,那就什么呢,AX再拆就是ha hi和a as啊,就是高八位和低八位啊就这么样一个拆分啊,那其他的呢,也都是啊,也都是一样从16位进行扩展,扩展上来的包括我们的aes啊,E这个E啊和这个EEP啊这些通用器都是啊,然后呢,我们再来往下看一看啊,我们这个段啊,段这个东西呢,我们是不是有一点点变化啊,那什么变化呢?首先呢,我们在这个32位的时候啊,我们看到的段啊,它是这个啊CSDS和S啊,我们通常情况下是见不到FS和GS的啊,但是他们也是有用的,然后呢,我们再来看一个问题,就是我们在16位的。
24:01
我们这些计算器通常指向你某一个段的起始位置,比如说我下段,我就是下段的个起始位置,它乘以十,或者说叫十六十,16进制十或者十进制16之后,它就是真正的这个起始历史了,但是我们现在看来,我们在这个32倍的情况下,你比如说它0023,它并不可能是一个起始位置,那这个东西是什么东西呢?这个东西它现在变成了一个叫做断选择子的一个东西,就是说我们这个断这个机制呢,它变复杂了,我们断选择子啊,存储在我们原来的断断计算器这个位置上,然后这个选择子呢,它可以进行一个拆分,拆分之后呢,里头有一个index,也就是一个索引呢,这个索引呢,你可以去找什么呢?找你的超级系统里这个有一张表,这张呢叫做GT表,那GDT表里的每一项都是一个什么东西呢?叫做描,那你原来的那个起地址它在哪呢?它在断描述符里啊,它还这个里边呢,断缩描述符呢,还有很多很多的属性可以给你使用啊,那所以说呢,我们现在的这个段呢,就变成这个这个东西了,那我们正常情况下呢,我们的。
25:01
GS段DS段啊,这个ES段SS段啊,比如说我们CS段是代码DS段数据ES段扩展SS对战啊,那这些常规的段呢,我们是了解的,但是我们FS段和GS么东西呢,那我们的Fsgs是30,比如说32的情况下,我们的FS指向做T的东西,这个TB呢是一个构,是什么构呢?做线环境线环这个在我们之后会到,然后呢,如果是一个64位的情况下呢,那我们的FS就不对了啊,那是什么东是G,我们的GS就指向了什呢块啊,所以说呢,他们俩实际上是就是在这个我们的这个啊32位和64位的时候,分别指向这个线路环境块的两个断进行器啊,他们这个断线原子依然也是去那边去找啊,然后呢,并且它这个结构里头还会指向一些其他的相关信息,比如说我们的这个peb结构啊,那就是我们的进程相关的一些结构啊,好,那么我们了解完我们的通用进行器和我们的断经器之后呢,我们还有一些扩展的东西,比如。
26:01
说我们在这个后续的发展过程中多了一些浮点寄存器,但是我们现在还没学浮点数,所以现在先不提,在我们后续的学习中呢,我们会了解啊,这个浮点数是如何来存储的,并且呢,因为我们的浮点数呢,在我们的32位中呢,它实际上是比我们通常情况下要长的啊,因另外它也是硬件寄存器啊,也是使用原来那种类似于所存的形式来进行存储的,那我们现在呢,就先简单的了解一下,后续啊学一些这个专门指令的时候再去看,因为我们的这个浮点数所有的操作指令呢,实际上都是独立的一套啊,他这长得跟我们通用的这些呢,还是很像的,但是只是会加一些这个,比如说加个F之类的东西,变成了一个浮点的操作啊。好,那么我们这些操作说完之后呢,我们再来了解一下,我们在32位下,我们可以多玩了一些什么东西啊,那如果说你学过C语言的时候啊,这个是你有福了啊,你可以调用一些C语言的库函数啊,但是你没学过啊,你也可以无视它,但是呢,我们啊现在呢,要来简单讲一下,比如说如果大家学过C语言的时候,那么你就应该了解虚元是如何进行输出的呢啊,它比如说它会调用一个叫做print f的一个这个函数进行输出,这个函数呢,你可以称之为库函数啊库函数,那么这个函数呢,就可以正常的保证你啊,这个输出非常顺畅啊,可以格式化各各种各样的字符串,那么这个函数通常怎么使用的啊,如果你C语言中啊,那你就调用这个函数,然后呢,后边加个括括号,里边是个参数,比如说啊,前面加一个这个双引号,然后里边呢,通过百分号什么什么啊,然后来进行一个这个格式化,它是格式化什么意思呢?比如百分号D就代表我要输出一个整数,百分号S就代表我输出一个字符串,百分号C就代表我输出一个字符,百分S就代表我输出一个浮点数,那现在呢,比如。
27:40
就说我要在这个汇编里来使用它来要怎么使用呢?如果说我是一个C语言,我现在就是调用一个,然后是一个S可以了,但是我们现在不是一个C语言,我们汇编语言,所以说呢,我们要使用稍微复杂一点的方式来去调用,那么我们也是要调用,但是和我们的C语言的直接包含头文件不同,我们在汇编中呢,我们要使用的是lab啊,Lab,我们要includede它的lab啊,那我们现在比如说我们直接来写啊,Lab,那么lab什么东西呢?比如说我们要使用这个库函数,那么首先我们要包含两个东西,一个是UCRT,这个东西呢,就是所谓的一个这个标准的一个标准库啊,然后呢,我们还要包含一个东西,我们之所以要使用2015的运行库呢,实际上就是因为这个库在2015之后就不存在了啊,它叫做呃,很长啊。
28:30
啊,然后studIoTo啊,然后DeFine in it啊,Ins。啊,应该是这西啊,然后一个lab啊,就这么长一个东西,然后呢,你像C语言,你可以直接去调用它的函数,但是我们在汇编中,我们也不能直接调用它的函数,我们还需要一点东西,什么东西呢?你要它出来,那如果是WIN3API呢,你需要把它所有参数列出来,但是库函数不需要啊库数你直接啊调用一个叫做ten的关键字,然后比如说你要调用这个F那啊那我直接啊,那不能加括号啊,要干嘛呢?冒号,然后PC啊那这个了,那正下我们这个F个符,现在呢就可以来给它,呃写一个格式化字符串,比如说我叫做SZ啊,就是代表一个字符串啊,然后format啊,它就是一个格式化字符串,然后呢,我这儿给它用一个D啊,这个D我们16时过了,就是个八的一个符啊,那我们就不管它,然后呢,三二注意啊,32位它的这个字符的这个写的式跟以前不一样了啊。
29:44
还是啊,两个单引号,然后呢,里头比如说我格式化,我要输出字符串,我一个百分号S,然后呢,后边要跟什么呢?你要跟个零啊,跟个零啊,那比如说你要输出一个这个,呃,整数呢,你就百分号D后边跟个零啊,就是这个区别,那比如说我现在我先输出一个这个整数啊,我们来演示一下,那首先呢,我们把这些东西啊,我们先给掉,然后我在这个我给这个,首先比如说我要打印一个数,我到EE个或者是64H,然后我现在呢,把这个打印出去,那如果是16位的情况下,我们调用一堆中断是不是很麻烦啊,那现在呢,我们不需要这么麻烦,我们只需要干什么呢?我们只需要去把它啊按照这个我们的库函数的调用方式去调用,首先我们这个东西,我们要传给这个参数,我们肯定是需要传给这个函数,我们在32位下肯定要push对栈的,所以说呢,我们直接一个push。
30:37
啊push啊,Push什么呢?Push我们的ex啊,然后这个值我们就进去了,然后呢,进去之后呢,我们接下来要给它打印啊,那打印怎么做呢?我们现在呢,要给它啊把这个字符串传进去,注意我们这个字符串要传地址进去啊,我们不要把这个值传进去啊,因为一会儿它函函数他接收到的,要接收它的地址啊,所以说呢,你有两种方式,一种呢,就是move什么呢?一个这个呃,比如说我放到这个,然后呢,给这个S行一个偏移的一个地址的一个获取,现在呢,我就把它地址获取到了,然后我直接再给它push一下这个ex。
31:14
啊,调用完这些东西之后呢,接下来呢,我就调用一个拷一下什么呢?拷一下我的print f啊拷完之后呢,我要进行屏站,因为呢,我上面呢传push了两个参数啊,所以说呢,我在32位下,每一个参数占四字节,也就是一个int的大小啊,或者说一个啊D一个大小啊D就是呃D啊这个就这个啊,这个它是一个32位的一个宽度啊,就是32位宽度的一个整数啊,然后需要这么大啊两个两个这么大,那就是八字节啊,那八字节呢,我现在A啊,那我在16位的时候,我评的是SP,那32位我评的肯定是ESP对不对啊,它扩展成32位了ESP啊我评什么呢?评八啊,这样呢就完事了啊这样进行评战,那现在呢,我们在这儿下个断点啊,下个断点啊,我们给它在头上下个断点吧,然后一步一步执行啊,我们现在给它关掉,关掉之后呢,重新运行。
32:03
哎,我这飞哪去了,没执行到这儿吗?我看一下啊。哎,还真异常了,我看一下啊,稍等。断点。嗯。那个百块地有毛病。哎,不对,没毛病,百分号D这没有问题,Ten p ntf PC这也没什么问题,那除非就是这个写错了,我看一下啊,这个LG。
33:04
ACY校线STDL校线DeFinit。Is lab,诶没啥毛病,我重新生成一下看看。诶,成功了呀。这点c.lab点节应该是有一个未处理的,什么意思,我们运行一下看看啊。啊,它是没有断下来,但它实际上正常执行了啊,你看到没,我们正常执行了,已经是有一个100倍输出了啊,所以说它是没问题的啊,它是没问题的,这个断点是。它在哪执行的,这个是应该是结束的时候执行的,我们是没断下来啊,我们是没断点没断下来,然后呢,我们这个这种方式,你可以看到它已经打印出来了,打印出来这种方式呢,说明我们这个调函数的调用是没有问题的啊,一个100已经出来了,那么接下来呢,我们还有另一种方式就是什么呢?调用我们另一个学习过的这个呃取例方式就是调用lea语句啊,那这种方式呢,你比如说还是X,那我们直接把它的啊给它,呃呃放过去就可以了,然后呢,我们再次运行。
34:17
啊,他崩塌的啊,我们看啊,我们今儿啊调用了100,看到没调用100没有问题啊好,那我们这儿呢,就已经知道了,我们的这个库函数啊,就是库函数这个西源这种库函数一个调用的,那如果我们调用我们刚才说过的微软提供的我们API是如何用的呢?啊,那这个东西呢,就是也要跟我们这个库函数使用类似的方式,但是呢,它的库呢,就是我们的这个系统的一些比较常见的库了,那比如说我们现在呢,要调用一些类似于这个box啊弹框啊,或者这个像我们正常程序推出这种啊,那我们就要调用什么呢?就要这个包含一些这个的lab啊,就包含一个这个K克三二点lab啊,我们包含一个克三二点lab,然后呢,再包含一个优侧三二点lab。
35:10
然后这种呢,我们就要稍微复杂一点了,因为我们这种API呢,它需要你给他填参数啊,那比如说我现在呢,我要一个呃box啊,然后A那这种形式呢,我们还是要调用这个。我们就不是pro ROC了,是这个pro to,然后呢指定它的参数,然后呢,首先比如说我这个第一个参数啊,是一个聚柄啊,那就是HWND啊,然后冒号是一个沃。啊,然后呢,第二个呢,我们加一个逗号啊,后边呢,跟的是呃LP啊test呃这个内容啊,内容呢我们是。嗯,贝塔或者说DB啊,然后呢,再一个标题。
36:00
也是啊,然后最后啊,最后一个啊,是这个按钮的类别U。Word啊,然后呢,我们这个东西啊就搞定了,搞定之后呢,比如说我现在呢,要调用它啊,那它四个参数啊,理论上而言,你应该给他都传上,但是如果说你比如说我们现在只是试验,我们偷懒啊,那我们现在其实有一种最简单的方式,就是我们直接PUSH0。啊,然后呢,我push一个零,PUSH2个零,PUSH3个零,PUSH4个零,Push完之后呢,我靠这个麦boss a。啊,这种形式其实也是没有问题的啊好,然后呢,我直接啊来给它运行。嗯,这什么情况,他这有点问题啊,稍等啊,这好像没执行出来。那不是QQ啊,那是群啊,有需要资料的您可以加群啊,我看一下啊,这个啊有问题啊,这没没执行出来啊,这个我给他重新生成一下啊,他这个执行好像很奇怪,我操。
37:10
未知的符号mabox a。然后后上面有个逗号是错误的。这还有个逗号是错误的。Meboxa pro,然后是。啊,他可能混淆了。还是有逗号问题,那逗号哪有问题啊,这有个逗号啊,这个应该是冒号啊,写错了。哎,你看这回他就弹出来了,正常的框就弹出来了。对,最后一个是逗号啊,看错了啊好,那弹出来了啊,这个就没问题,我们的这个API啊,就也调用成功了,并且你注意啊,我这个push完之后,你很明显我没有调用啥啊,没有调用屏站啊,因为它不需要,那我现在弹我这个弹完框之后我退出,我还是报异常啊,那这个怎么办呢?那这儿呢,我们就调用另一个啊eit price它的功能是么呢,上这那下这个呢,它这个作用就是出当前的种为的方式出,比如说我还是pro,然后呢,我现在呢给。
38:28
传一个这个应该是错误码,或者说退出类别啊,但是我这直接一个type啊嗯,Code吧啊有code,然后呢,我给他写一个这个迪沃D,现在呢,我就可以来调用它啊,那我们这个参数呢,实际上是一个这个退出代码,那比如说我再push试一个零啊,那就正常退出嘛,然后call一下它ex啊price好,然后呢,我现在呢就可以来干嘛呢,我就可以来这个正常的运行了啊,我们运行一下。点确定,诶,他怎么还异常呢。
39:01
哎,他是哪异常的呢。不应该在异常啊。触发了一个断点,我们跟一下啊,我们看一下他到底从哪异常下下个盾。确定。哎,没执行到我这儿好像。不对,他这个断点没断下来啊,这个配置应该是有点儿问题。好像说是这个UT导致,还是什么东西导致的,我这个断点没断下来。对,是可以用那个指令的啊,可以用那个指令的,但那个指令有一个问题啊,就是我上次在讲汇编的时候啊,我教了他们怎么用那个ma ma个库,然后怎么去文,然后怎么去那个调用啊,直接使用那个VO的那个令去这个A,然后一个个的来,我告诉我啊,这个ma这个行装不好,完之后有问题啊,完之后了啊,后来我决定了干脆别用啊,不用就不会出现问题啊。
40:16
好,那么我们这个呢,就是这个断点问题,我们下集再解决吧,然后呢,我们这集呢,主要是来告诉大家一下这个WIN3API和库函数,以及这个基础的配置,然后呢,告诉大家调试工具,还有一个问题需要今天解决,就是什么呢?就是我们来啊去找一下,就是这种短的,我常用的,我知道它参数是什么,那如果说不常用的,我们怎么找呢?我们就直接去MSDN找啊,我们去MSDN找。我刚才在这个API上啊,这个摁了一下FT,他这没没出来啊,那我直接搜啊,直接搜,比如说这个ma bos a啊,那我现在呢,用这手也行,我直接用那个,呃,这是ID文档啊,这不是API文档啊这个。这个你看着没,这就是微软的啊,Microsoft的一个这个document啊,一个这个文档啊,你可以看到它包含哪个文件都告诉你,当然汇编里你也不需要在乎它的哪个文件,你需要在乎的是什么呢?是在乎它在哪个里,它在这后边呢,有一个参数的一个描写,你比说它这个啊,在这个头是在哪呢?是在这个window里啊,或者说啊,包含在这个windows.h里头,但是正常情况下呢,你不用这个东西,你汇编里用的什么是B,那所以说呢,你看这底下这个library,这个library呢,告诉你它在这个U的library里啊,那你就把它给这个lab上啊就可以了,然后呢,它前边呢,还会告诉你什么呢?告诉你各种各样的参数是什么意思,比如第一个啊是一个窗口句柄啊,可以填到,然后第二个呢,是一个这个内容啊,这个内容呢,通常情况下呢,是一个这个字符串,然后呢,是这个可以是多字节的,可以是宽字节的,然后下一个呢,是这个标题啊,也可以是这个,也可以是这个闹啊,然后这个底下这个啊,最后一个是按钮的一个类型啊呃,比如说我们如果填红的话,是什么m BOK啊,什么乱七八糟的,你看啊m BOK呢,就是一个OK按钮,如。
42:00
果是这个这个呢,就是一个一个取消啊,然后呢,还有这个yes no啊这种的啊,它可以接收返回值啊,它返回值是一个整数啊,然后呢,比如说你接收到一个这个IDOK啊这好像啊这呢,比如说是你这个yes,这个yes OK那个啊,不是不是yes no啊那个你比如说你这个返回了一个S啊,这边也可以确定啊ids,那如果返回OK,你就是IDOK,判断一下返回值和这个是不是相等,就知道你了哪个啊,然后就可以确定啊,你到底是怎么进行一个处理好,那这个呢,就是它这个返回值啊,然后呢,你比如说这些参数啊,它这也都有啊,然后你只需要干嘛呢?给他,给他根据它的类型转换成我们汇编拥有的类型,你比如说这个窗口句柄,很明显我们在汇编里头是没有这个类型的啊,这个HN这个类型的,那怎么办啊,这个东西本质上而言,它是一个四字节的数据,所以说你可以用一个进行啊,那通常情况下呢,我们在32位下的各种各样的类型,它基本逃不脱几种长度,要么就一个字节,要么就两个字节,要么就四个字节,要么就这个八个字节,然后呢,就这几种长度,你比如说你。
43:00
如果是一个字符串,那就是每一个单位,它就是一个字,一个就是一个字节啊,那你这个东西就好办了嘛,那你就给它转换成相应的单位,比如说你各种各样的字符串,你全都使用这个DB啊,或者都可以,然后呢,你这种四字节的,比如说这个handle啊,你这个HWND这种东西全部都默认就是啊,就都可以调用了啊,就这个意思。嗯,我也不知道啊,我不知道MIS32有没有这个补全工具啊,如果说你觉得这个我用这个studio不好用的情况下,我觉得我推荐你用另一款。用这个东西,这个东西我觉得要比那个它自带的那个东西要好很多啊,就是这个这个red asm这个东西啊,它里边呢,也包含了这个MSNS等等东西啊,什么补带高量啊,然后呢,但是它有一个问题,但调试呢,它不是使用这种原生的这种调试啊,你像我这个调试,我是VMS自带的一个调试,你可以直接从这里看这个算器啊内存什么的,但是你那个东西那个redm,它使用的是,呃,这个only作为一个调试工具啊。
44:06
呃,另外呢,它这个对这个1.0版本,反正是对这个64位支持,好像不支持吧,他2.0好像支持64位了,我记得啊,我不太记得,因为我不太用那些东西,我都是用VS丢啊好,那么今天呢,我们就先讲到这儿啊,然后呢,下节课呢,我们继续来讲啊,继续来讲,那么这节课有什么问题啊,你就提出来,没什么问题呢,咱们这个视频呢,就先到这。
我来说两句