00:00
啊,然后呢,今天呢,咱们就已经进行到这个下一个阶段了啊,就是咱们我那个东西改这边放了,咱们之前已经讲了这个19节的汇编了啊,从16位到32位啊,并且到红汇编,然后呢,简单介绍了一下啊这个书籍啊,那么这节课呢,我们开始讲这个64位的一个汇编啊,然后来带大家来了解一下它相关的一些这个知识,呃,我们首先呢,来新建一个项目啊,新建一个项目啊,直接还是空项目就行啊,然后点击确定。然后我们新建一个,哎哟,等一下啊。那个那个助理同学,你回来一下,那个有有点事。
01:03
这这后台。好,然后呢,咱们先设置呀,设置啊,设置一下它的生成依赖项,生成自定义啊,咱们直接把这个ma SM勾上啊,我这再强调一遍啊,咱们勾的是这个第四个的这个asm啊,它上边这个东西叫Mar mam,它上面是ARM的汇编啊,就是上就很很多同学他会在这一步的时候看两个长得像,然后点错啊,点完错之后他会来问我他为什么会错啊,所所所以说这个就很尴尬,那么我们在点的时候,你干脆就注意一点,它是ma SM,不要选那个长的啊,勾选上之后直接点确定就可以了。接着呢,我们来这个添加这个原文件啊,新建项,新建项呢,我们直接啊给他,比如说我们现在是一个这个呃,64位的嘛,我们随便啊无所谓叫什么都行,比如说我叫一个叉六四的一个4as.as啊这种没问题啊,然后点击确定添加啊好,那么现在呢,我们一个这个汇编的一个原文件就创建出来了啊,那么我们的这个32位版本,它还其实还是需要很多很多的东西来进行一个包含的啊,但是我们现在64位啊,就它一些段呢之类的,还有一些这个比如说内存的对齐呢,其实是不用你特殊的进行一个声明的,那怎么样呢?你直接点击点点code就是声明一个代码段啊,然后这样的你在中间写代码就可以了啊,这个是这个,如果说你这个main函数不在当前的文件里,你这样的一个代码段就够用了,如果说啊,你是这个main函数啊,你想写在这边,你可以用两种方式,一种方。
02:49
方式呢,就是16位时候我们使用过的start的方式,还有一种方式呢,就是属性里啊,注意这调的是64位版本啊,64的,然后呢,你设置一下什么呢?链接器里边有一个高级啊,你要把它的这个入口点啊,设置成这个函数啊,或者说叫其他名也行啊,这个其实不影响啊,然后我们应用确定啊,然后这个时候你再把它啊也调成64啊,这样你就可以写64位的汇编了,比如说我们现在有一个这个入口点程序啊,那我们就写一个may,然后PC啊,然后一个may啊N的P,这样呢,最简单的一个may函数就写完了,那比如说我现在呢,在面函数里头啊,我这个萨一个RP,然后28H这个保,然后呢在这个64位下啊,一般情况下,我们都需要这么写一下,因为64位下的调用约定是有改变的,一会儿呢,我们再来说啊,然后我们啊上下啊。
03:49
那我对战之后呢,比如说我这儿呢,我肯定是要这个写一些代码的,然后在结束的地方呢,我需要一个it return一下对吧,那比如说我们现在写一个最简单的木ses么。
04:04
你可以看到啊,那生成是成功的,也就说我们这么最简单的一个代码,实际的是没有问题的啊,然后我们这下一个断点啊,然后运运行起。也可以看到啊,我们是可以这个执行的了,比如说我们写一点这个标,这个特征明显的,我们给ex一个这个0X1234123412341234啊,我们给它赋个值啊,然后我们重新生成。嗯。我这好像写多了,算了,我去一半啊,我没数到底有多少个F,应该是写多了啊好,然后我们重新生成,诶不对啊。啊,Ex啊,这是ex啊,我们要给那个rax啊,刚才那个长度是rax的长度啊好,然后我们重。嗯,这回什么毛病?木RX0X啊,写法问题啊,后边加H啊,不能加那个0X啊,刚才长度也不一定有问题,诶这什么玩意。
05:06
啊,还得加个零,要求比较多啊。哎,你看这回就成功了啊,纯这个16进制数啊,它前面如果是字母的情况下,你要加一个零,如果是数字的话就无所谓啊,他加这个零的目的呢,是告诉你这个东西是一个这个什么样的一个这个数啊,就后边加H代表着16进制,前面加个零啊,给他这个区分,给一些这个其他东西进行一个区分,好现在呢,我们运行。运行完事之后啊,我们现在呢,就直接这个F10,然后呢,我们注意这个ix,然后再啊,你看它这个就赋值了啊,其实刚才那个长度应该是没有太大问题的啊,我们数一下啊,1234 1234,然后我们复制一份啊,然后来这个这个就是64位的一个长度。然后我们运行。运行F10啊,现在呢,注意is的一个值啊,然后你看RS就变成了八,呃,16个F啊,16个F啊,是那个八字节128位啊,啊不是八字节128位,64位啊,我今天这个略带一思T啊那个什么啊,然后呢,我们这个64位节就是,然后我们现在呢,就已经把它这个附上去了啊,这就是最简单最简单的一个64位的汇编程序的这个选项,创建项目选啥?选这个asm啊不是。
06:28
就啊,嗯,你可以找这个咱们的助理要一下录播吧,我就不重复给你看了啊,咱们这个录着呢,你就这个找咱们的老,然后呢,联系一下加群领一下录播,然后咱们这个之后呢,会提供给你一个视频啊好,然后呢,我们现在呢就来接着往下写啊,我们现在呢,已经最简单一个main函数就有了,那么接下来我们还需要了解一些,就比如说常用的库啊,还有一些API啊,怎么调用对不对,我们在32位16位的时候也都用过,比如说这个标准库啊,这个print f和那个ma Bo啊这种东西啊,那我们在这个学习这个东西之前呢,我们首先呢要了解一个东西就是什么呢?就是函数调用约定,那我们前面的函数流量约定呢,在这个16位,32位和这个时候呢,它其实比较多啊,比如说我们最常用的啊,C的标准库的这个调用约定是c de CL win32api呢,就像我们前面用的bos这类东西,它的这个函数调用约定呢,是ST。
07:28
Call,那如果你用的是C加加这种语言编这种语言这个进行这个编写呢,它实际上还有一个特殊的叫约定,叫做Dis call,因为它呢在默认传这个类的时候呢,有一个Dis帧需要通过ex进行一个传值啊,所以说呢,它有个disc,那还有一种呢,就是快速调约定fast啊,那我们在这这些呢,都是属于什么呢?都是属于这个叉,这个叉八六的架构下的啊,我们16位也可以啊,32位也可以,但是我们64位啊,叉六四的情况下,通常情况下我们只有一种调用约定就是fast call啊,这个fast call呢,和32位的fast call呢,它是有一定差别的啊,32位的fast call呢,是前两个寄存器啊,使用这个,呃,前两个参数使用寄存器传参,后面呢使用堆弹传参,而我们64位的情况下呢,前四个参数使用存,后面呢使用传参,那前四个分别是什么呢?分别是RCXRDXR8和R9存器啊用这四个来传参,那么。
08:29
这个时候大家可能是呃,有一些疑问啊,我们R8R9是什么东西啊,这里呢,简单告诉大家一下啊,在我们的这个64位啊,他这个除了对老的这个寄存器进行了一个扩展啊,从把这个八个通讯器RXRDXR,这个CXRDX啊,RRSI啊,这个r Di,然后还有这个RSPRBP这八个啊做了一个升级,从32位变成64位了,它还有什么呢?还有扩展了这个八个通行均器,就是R8R9 R10 R11 R12。
09:03
二十三二十四和25啊,那么这个时候呢,我还有一个东西需要特殊说一下,就是这个一啊,32位的这个一啊在之实际,那么我们现在呢,就来了,就了解到了啊,那这个28R9是什么?其实就是新增的64位的通用计算器啊,那也就是说它四个啊,用两个老的通用计存器啊,两个新的通用计算器啊来进行这个传参,后边呢,它会干嘛呢?后边呢,它会从这个RP加0S20的位置开始使用堆栈传参啊,然后之后呢,依次加上什么呢?加八啊一次加八,为什么加八呢?因为64位下啊每一个参数,它这个地址度是什么呢?是八字节啊八字节,所以说呢,后边一加八,那为什么从0X20开始这个往这个R这个里边值呢?
10:03
是因为啊参呢,是因为前四个啊,四个参数是要给这个RCXR和R预留的这四个参数啊,值之后,参之后在这个我们的这个函数内部,需要把它的值再放回到RP加的这个位置上啊,然后再进行使用,当然了它之后呢,可可能会有一个这个呃,位置的改变,这个我们之后再讲,大家先有一个概念性的一个了解啊好,那么我们说完之后,只大家知道它是什么样的一个这个调用约定了啊,那我们现在呢,就可以来开始写了,因为我们一会儿大家进行函数参数的调用的时候呢,就需要使用这种方式来进行一个传参。好,那么接下来呢,我们现在呢,就来这个给它包含一些这个lab库啊,当然这个也可以使用32位那种IC的模式,但是因为我们下载的那个东西,这个32啊,它它实际上而言呢,有些东西对64位呢,不是特别友好,你可能需要自己改一改啊,但是呢,我们直接B库,然后进行声明,这种事肯定是没有问题的,我们首先呢,Include lab啊lab一个什么呢?这个C啊,这个UCT.lab啊,我们先搞一个这个呃,库函数的啊,然然后我们在这啊用键属性啊,我们因为我想用一些东西啊,用一些东西它这里边没有啊,这个141版本删除了,我们用140版本啊,应用确定啊,然后呢,我们再来包含include lab,嗯,那个东西叫什么来着?
11:30
嗯,Le,然后studio啊。In it。啊。啊,应该应该是这样啊,然后lab,好,那么我们现在呢,就包含完了这个常用的这个库文件的一些东西,接着呢,我们在32位下也是同样的使用方式,如果说我要使用一个比如说print f这种东西,那我们应该怎么样,我们现在应该对它进行一个声明,对不对,就是STEM对吧?那我们现在呢,就ten啊,比如说ten一个print f啊,然后呢PLC啊,对它进行一个明,接下来呢,我现在就可以对它进行一个使用了啊,那我要使用的时候呢,我现在呢需要点一个数据啊,一个点data,这个点data呢,不需要end啊,你放在这个code上面就行了啊,你这里边呢,还有几种形式,就是点data啊这个数据啊,然后呢,这个点初始化的这个数据,然后呢点啊数据啊,这三个还是有点区别的啊,然后呢,一般情况下呢,我们可以使用它来定,定义一些常量啊,然后它呢,定一些未初始化的,但是是如果说你懒的情况下,你可以。
12:44
把这些东西都塞在这个点里啊,它是不会出现问题的,但是如果你把这些东西啊,比如说常量的东西放在未未初始化那里边,它是有一定几率会出问题的,也不是说完全会出问题啊,但是呢,你不要赌这个几率,你就干脆点用点data啊,相对而言反而好一些啊,那比如说我们打印一个这个hello world,还是这个我们DB啊,每个占一个字节啊,然后。
13:16
Hello。然后以零结尾啊,序原形式以零结尾的字符串啊,接着呢,我们用这个print f进行打印的时候,你还需要一个这个form form的格式化字符串啊,我们现在呢,给它定义一下啊,我们现在要打印的是一个字串,Hello,所以说我们用一个100S啊好,那我们现在呢,已经把这个需要的这个变量啊给它声明好了,那么接下来呢,我们就开始使用它了,我们这里边呢,啊,你能动的代码只有这一行,其他呢,属于标准性框架啊,你就不要乱动了,接下来我们首先我们要知道我们要传的方式是发,那么也就是说呢,它的第一个参数呢,是要放在RCX里的,那它呢在C语言里啊,调用这个F是个什么样的呢?比如说我们调上这个东西,那么现在呢,它就是F啊,然后号S后边的呢,就是一个我们的这个。
14:09
是一种这样的一个调用形式,那么我们在汇编里的时候,首先我们要传的第一个参数,这个就是这个格式化字符串,那那它就是第一个参数,那么它需要放在哪呢?根据我们发用你需要在这个R,也就是说呢,你在这个后呢,RZ这个format啊,你应该这么写,然后呢,第二个参数啊,第二个参数放在哪呢?放在这个呃,RDX里啊,放在RDX里,那这个第二个就是Le r DX,然后后边呢,跟的是什么呢?跟的是hello啊,这两个都是取字符串地址,然后底下呢是什么呢?是这个call啊什么呢?Co对吧?那么你也可以看到我实际上是倒着写的,也就是说它实际上的传单规则是怎么样呢?先从右边开始传啊,就是从最后一个参数开始传,然后往左传啊,离的这个F最越近的啊,看到没形越近的,离它的汇编代码也越近啊,也越近啊,他们是一样的啊。
15:09
好,然后呢,我们现在呢,可以重新生成一下。嗯,我看一下啊,有一个点儿啊,我这儿写写错了啊点,然后呢,我们这个需要这个呃,往期的课程的工具的源码的视频的啊,可以加入讨论群,也可以联系老板直接加他微信啊获取好接着呢,我们现在呢,就可以给他进行一个重新生成。因为我们没有调用类似于这种东西啊,所以这个断点呢,你要给它下在这个对这个恢复对站这里啊,然后直接运行。这样呢,它在这儿就会断下来啊,不会退出啊,你可以看到啊,我们这个hello word就已经打印出来了,对吧?那么这个呢,就是我们调用库函数的一种方式啊,那我们一般情况下,除了调用库函数之外呢,我们在Windows编程啊,最常用的呢,还有一个就是你需要调用一些Windows的一个API,对不对,那么我们现在呢,就来调用一下这个VA。
16:04
我们这个呢,其实呢,函数调约定呢,还是很接近的啊,那么只是说呢,我们现在呢,要改一点东西,比如说我现在呢,要用一个API的情况下,我就需要再来对它进行一个这个。啊,那我们现在呢,就是调用API的名字啊,SA,然后呢,PC啊这样就行了,它后边呢是不需要写参数的啊,不需要写参数啊,如果32位版本呢,你是需要这个把它的参数也都写上了,但是我们这个呢,就直接这么写就行了啊接着呢,我们比如说啊,我这回呢,我就不用格式化字符串了,Hello word是依然的,但是呢,你还需要给它类似一个标题的一个东西啊,这个东西你可以给它写成这个内容,那你还需要一个类似于标题的东西,比如说。DB啊,然后。啊这样,那我现在呢,还是要传参,那ma box,它这个调用怎么样的呢?我们回忆一下,如果用C语言的情况下,那就是这个magic magic box a啊就是阿版的,然后呢,第一个是什么窗口句柄我们传唤到,然后第二个是什么呢?第二个呢,就是它的这个内容啊,内容呢我们传个它。
17:20
哎。等一下啊,第二个是下一内容对,然后第三个呢,就是标题。啊标题我们用这个第四个是什么啊,第四个啊是它的按钮的类型,比如说我们传一个m BOK啊,M BOK呢,实际上而言呢,就是什么呢?就是一个这个确认按钮啊,就是一个确认按钮,那现在呢,我们按照它的这个调用约定啊,我们从右往左填和从左往右填都行啊,如果从左往右填啊,你就是先把这个打上,然后倒着往上填,如果是你从右往左呢,就是顺着往下填啊都是行的,比如说我现在啊,首先这个m Bo OK啊,那它是这个第1234个参数啊,那么它是第四个参数的情况下呢,你就给他传一个m Bo OK,那MPK呢,你可以去查一下它的红的值到底是多少,但是我这呢,默认给他传个零就行了,也就是说R9啊,R9计算器啊,我们直接木R9,给他一个零,就相当于赋值完了这个参数,接下来呢,啊是这个R8啊,R8呢是一个什么呢?是一个这个东西啊,那你可以用这个木,然后用opposite也你也可以直接用一个lea,然后R8,然后呢,给他把这个地址啊获取出来。
18:28
接着呢,就是这个我们的,呃,第二个参数,第二个参数呢,就是内容啊,内容呢我们直接给它lea啊,然后呢是我们的RDX,然后也把它的这个地值取出,在最后第一个参数是个now啊,它呢需要放在RCX里,那r cx now是什么东西,Now实际上就是它的红后边就是零啊,那我们给它传一个零啊,你可以看到啊,我们参数就完事了,接下来呢,调用call call什么呢?Call box a啊这样就行了,好,那么现在呢,我们对它进行一个重新生成。
19:06
你可以看到啊,我们已经生成成功了啊,那么接下来呢,我们就可以来运行一下。运行之后你可以看到啊,成功的弹出来了啊,但这个克后边跟了一个百分号S啊,我看一下啊这个啊,这我们又以零作为结尾啊,所以它这按着数据段就顺下去了啊啊我们重新生成一下。好,现在呢,我们来运行啊,来看一下啊,正常的弹出了啊,内容是hard word,然后标题是瑞ER啊,这个我们写的就没有问题了,这个呢,就是我们调用这个API的方式啊,所以说呢,也没有什么问题了,那再接下来呢,我们写一个什么东西呢?比如说我们现在呢,就写一个这个循环啊,我们写一个循环啊循环打印,那循环打印呢,我们在这儿呢,就需要一个什么呢?需要我比如说我们循环100个,我们需要一个format,那肯定是100是数字嘛,我们用一个百万二D。
20:06
然后呢,我们现在呢就可以写了啊,但是这个前边呢,我们写的都是教育传统的,其实你可以用这种类似于这个while的这个为指令啊,那这种为止令怎么用呢?就是你首先一个,比如说我现在呢,上边我再定义一个值啊,比如说这是一个index啊,那这个index的值呢,我用一个DD,我先给它设置一个零啊,这是没问题的,对吧,那么我就判定什么呢?就是我这个index啊index如果说啊,它这个呃,比如说小于100啊,那我就循环啊,然后呢,我后边一个N的W啊这样就行了,那么我在中间呢,我就可以加什么呢?就可以加我这个打印啊什么的啊打印什么的,那我现在呢就可以来这个,比如说啊,我这儿打印的是这个index的一个值,我就目ex啊,不对,我直接目到ecx里,嗯,对,我应该目到EDX里啊,然后呢,把这个接着呢,我进行一个目录啊EDX干嘛呢,我用RDX,然后呢RCX啊,我给它把这个格格式化字符串。
21:05
呃,D啊,然后呢,我用一个这个off为指令给它取出来,然后接下来我就调用什么呢?Co f啊,这样就理论上没有问题了啊,我们重新生成。我看一下啊,这有个点儿。嗯。不对呀,应该是点啊。哎,我写错了吗?我看一眼我以前写的代码啊。不应该呀,我这个有点儿懵了。MS为指令啊,我掏出我的代码看一看啊,反正前面都写过。
22:13
对啊,没有问题。小大于,如果说点。点位啊,如果说他这个。大于大于100。然后木。嗯。看一下。
23:03
算了,比我开大呀,我先不用为指令了,我们直接写代码,我首先啊清空出一个这个RSI,然后呢,我们在那什么啊,再来这个清空一个这个RBX,然后呢,我们现在呢,要循环这个零到100的情况下啊,我给这个RI最大值啊,赋值一个这个64H,也就是16进制64也就是100,然后接下来呢,我给我的索引也就是RBX啊复制一个零,接着呢,我要对它呢进行一个跳转啊,跳转到哪呢?跳转到后边去啊,然后我就说我给他一个录N。然后呢,我这个路喷我去干点什么呢木哎。
24:02
木RDXRBX啊,把它取出来,然后呢,我们要对它进行打印,RCX,然后SZ,呃,Format d。然后呢,我们给他再拷一下这个print f完之后呢,我们对比一下我们的这个RBX和我们的最大值啊,是不是这个一样啊,然后呢,我们用一个介啊进行一个跳转判断一下啊,比如说我现在呢,是一个这个loop啊loop c,然后我们跳转到上面去啊跳转到上面去,然后呢,对它呢,进行一个INC啊加法自增啊加自增索引啊,如果说呢,是这个没到这个64就自增索引到64的就直接往下走就没了啊就这么完事,好那么现在呢,我们来运行一下。嗯,等会我看看还有个点是什么毛病啊,这多了一个逗号啊。
25:00
好,然后呢,我们重新生成。重新生成之后啊,我们来看啊。看到了吗?我们零到零到呃101啊,就打印出来了啊,零到101就打印出来了,然后我们可以给它简单优化一下,比如说我们在这个分麦地后边呢,给加个空格啊,然后呢,重新生成。运行。看这就是什么呢?这就是啊,从零到101啊,他这个多判断了一个啊,我们这儿呢,应该给他少少写一个63就行了啊好,然后呢,我们这个判断完之后啊,我们现在已经写出循环来了,但是为什么我不给它换行,而是空格的方式呢?这个主要是因为它这个换行不使啊,我们来看一下啊,我我一会告诉大家为什么不好使啊,就是这个反斜杠N这个东西啊,我们重新生成。然后运行你看啊,它是没有用的啊,它直接当字符串给你打印出来了啊,那么这里头呢,它是有两种方式啊,两种方式能解决这个问题啊,一种方式呢,是我们直接向我们32位写的时候啊,他我们30位不是自己封装了一个红吗?那个红的它的作用是打0D0A 0D0a就能换行啊这是第一种方式,还有一种方式是什么呢?还有一种方式呢,就是我们用C和这个汇编的这个混合方程啊,这个编程的方式啊,就是从这个我们呃西园那边啊写点东西啊,然后呢,再回来啊,进行一个这个调用啊,那比如说我要这么写的话呢,其实呢,它就需要我们首先啊来再来一个头文件啊,不是来一个原文件啊。
26:35
然后比如说我这啊,直接是一个test啊,点CP添加,添加完事之后呢,我们把这边的这个main函数就取消掉啊,比如说我们现在呢,就是给它改成这个瑞啊,我们把这个main函数放到那个我们呃C源那边去啊,然后现在呢,我把这属性,然后呢在这个浏览器和这个高级这里啊,把这个入口点去掉,然后接下来呢,我们在西客加加代码商城这啊把它的运行库啊设置成我们的MTD,然后应用啊确定好,那么现在呢,我们就可以回来写这个下压代码了,我们首先呢,包含一些常用的这个活文键啊,比如说我们STDIO啊,标准的输入输出头啊好,那么接下来呢,我们用一个may啊来进行代码的编写啊,写一个最基本的main函数,那么现在呢,我如果要去调用它的汇编的一个代码,你应该怎么去调用呢?啊,那其实呢,很简单啊,你现在呢,就是这个瑞ver这个函数,你要在汇编里,你要在C原里C加加里调用啊,那你就还是啊用一。
27:35
Ten啊,直接把它以ten c啊,然后呢,你给他这个名字不是有了吗?你用汇编里的那个名字,然后呢,参数你自定,你像我们现在这个函数,它是不需要参数的,那你直接啊给他那个来一个空的,然后前面呢是它的返回值啊,那我们现在这个函数也是不需要返回值的,那我们就是一个word啊,所以说呢,你就按照C语言的这个编程习惯啊,把它这个声明出来,声明出来之后呢,你直接先在这儿一个调用啊就可以了啊,我们来试一下啊啊,那我们我我在这儿再包含一个,那什么包含一个include,然后std吧,我想用一下这个system call。
28:11
啊,不是system过去了,System。好,我们现在呢来运行。我看一下啊,他什么错误。嗯。理论上没有问题。我把他屏蔽一下,看一下啊。哦。
29:02
我我知道了啊,这个主要是因为我们在这边做了这俩声明的缘故啊。他应该是不能这么这么搞。他这个F的问题。那我们如果要在这边打印东西的话,我们可能也比较费事啊,那我现在给他这么写一下吧,我们。我想想啊。我要在这边调用,然后在那边进行声明,那我现在呢,在这边呢,我就要写一个函数啊,写一个函数,然后呢,比如说我现在写一个word啊,无返回值的,然后呢,Print r k VR啊,或者说print word啊,然后我这里边呢,要传什么东西呢?就是传一个int啊,传一个or的一个值。
30:01
然后呢,我在这边啊,对它进行一个打印啊2D,然后呢。打印啊好,然后呢,这个时候呢,他呢,就可以在我们汇编这边啊,进行一个声明啊,我们直接啊。然后调用它的这个函数啊,PC接着呢,我们在打印,因为打印这个数的时候呢,就不需要再传这个东西了啊,我们直接调用这个call,然后呢。然后呢,我们直接给他的RCX传一个数就行了,而不需要再给这个RDX传值了,那也就是说我现在目RDX里啊,那我这个RD应该目到RCX里啊,我们尝试一下,看我这个写的对不对啊。还是不对。这哪写错了这个。
31:32
啊,这的问题啊,这个UT它这个和其他东西冲突了啊,然后呢,我重新生成一下啊,刚才那个应该是没有问题,它是库冲突了,嗯,对库冲突了啊,然后呢,无法解析的外部符号,这回对了啊,这回对了,然后呢,我刚才应该是在这边使用的是。啊,那对啊,那刚才还是应该这样做啊。
32:01
好普F啊,这样的话回去调用实际上没问题的,但是它这个u rt实在我们C原也报了,带这个汇编也报了,所以它报错了啊,那我们现在呢,直接现在啊再回去啊,调用它应该是没有问题了啊,它应该是不会突的。来,我们重新认证一下。未知的符号F啊,这上边没有声明啊。好,然后现在我们运行。你可以看到啊,现在呢,它就没有问题了啊,我们在我们的这个思源这边啊,成功的调用了这个汇编里边的这个函数啊,这个呢,就是什么呢?这个其实呢,就是64位下的另类的一种这个混合编程啊,也算是内联汇编的一种,为什么在64位下要使用这种方式进行这个内联汇编呢?是因为我们在64位下,它默认的那个这种asm的形式呢,已经不再受支持了啊,就是我们默认的这个msm,英特尔这个微微软的这个编译器啊,它是不支持这种形式的啊,然后呢,你要说啊,也只能像我这么写汇编,也不是啊,你比如说你是可以什么呢?可以通过更换你的这个编译器啊,就是你现在呢,不是使用的微软的编译器吗?你可以使用英特尔的编译器啊,然后呢,你就可以干嘛呢,还是使用它的那些汇编了啊,就没有问题了,如果说你只能使用微软的这个编辑器,那你就只能跟我一样啊,在这边啊汇编里写一个功能,然后呢,在我这个C语言里边,这边直接啊声明之后进行一个调用啊,这是一种这个。
33:43
啊,然后呢,我们这个呢,就没有问题了啊,然后他呢,其实呢就可以了,比如说我们如果要写一些有参数的,其实也是同样的这个使用方式啊。比如说我现在呢,就是啊这个R,然后呢,我现在是PC,这是没有问题的,然后我再来一个。
34:06
N的P,但是呢,我现在呢,除了这个上边这个下边啊,我要用这种形式啊,给它写上之后,我这里默认的64的第一个参数是不是在RCX里啊,那么这时候我是不是可以直接用RCX作为这个参数的一个传递啊,那我是不是现在R有了,那我RCX有了的情况下啊,那我是不是就可以来,比如说我现在我把它干嘛呢?给它到RD里啊,把RCX值保存到RD里,然后我再给这个RCX。啊,一个这个format。接着啊,我进行一个call call什么呢?Call我的这个,呃,PF,那么这个是不是就形成了一个带参数的一个东西啊,那我现在把它呢声明回来,那怎么声明呢,跟它呢,就稍许有点差别,我首先呢是一个C啊,我返回依然是不返回任何东西啊,那我不返回任何东西,那我接下来呢,我就直接调用它,然后呢,我这样啊是不是啊声明好了,但是它有参数啊,那我是一个什么呢?我是用的什么做一个参数的RCX,那它就是什么一个U浪浪啊U浪浪啊,64位的一个东西啊,那我这是U浪浪,我还得包含一下那个。
35:27
包含一下windows.h的。它这个类型在windows.hd。好,然后呢,我们在这啊U浪浪U浪浪ul number好这样就没问题了啊,那我现在呢,我就来调用它,比如说我现在呢,我在这个位置上啊,我前面这个啊,我先给他注释掉啊,现在呢,我给他传个五啊,我们看一下情况。
36:03
好,上传成功了啊,那现在呢,我直接运行。你看是不是就打印出来一个五啊,这儿呢,是不是打印出来一个五啊,那这种就是什么带参数的这个内联汇编的一个调用64位的,那么我们现在有参数的,那我们如果说比如说我在想实现一个什么呢?实现一个这个带返回值的啊,那怎么写呢?那比如说我现在呢,比如写一个MYAD啊,我写一个加法,然后呢,还是PLC啊,然后MYAD啊,N的P啊,这个前后呢,它是没有区别的啊,我们直接复制过来啊,那么中间啊,我们有点区别,那我们现在是一个加法了,我们不需要在里边啊,搞什么其他乱七八糟的东西了,它两个参数通过什么RCXRDX啊进行这个传递了,对不对,那我们直接ADCX,然后RX啊,他们俩计算完之后,结果放到RCX对不对,然后呢,我们再move一下啊,Move什么呢?RRCX啊把R那么们在发下啊和我们的SD其实呢。
37:08
规范是一样的,都是通过这个is作一个返回,所以说呢,你现在直接放到is里呢,我们在外边就可以接收到这个值了啊,那现在呢,我们啊,把这个YAB在外边呢,做一个简单的声明,EST啊,然后ten c啊,不对啊,这回我们是有返回值的啊,那所以说呢,你要用一个U浪浪做一个返回值啊,然后呢,里边呢,还有两个U浪浪的参数ul啊,NUMBER1啊,然后ul number2,好,现在呢,你就可以对它呢进行一个调用。直接调用啊,然后比如说我现在呢,传一个这个一啊,传一个三,然后呢,我用一个U浪浪ULT等于啊计算接收一下它的结果,然后呢,对它呢进行一个打印啊,我直接用个百分D号D就行,一加三肯定够用了,嗯,放斜杠N好,然后是ul ret。
38:12
好,接着呢,我们给它进行一个重新生成。嗯,好像生成成功了啊,然后我们运行。看到没,已经算出来了,结果是一个四,这个就是什么?这就是有参数又有返回值啊,是这么来用的,也就是说呢,有参数有返回值之后,你就可以把C元的这个变量啊作为参数传进去,在这个汇编里进行操作,操作完之后通过返回值或者指针的形式再给它传出来啊好,那么这个呢,就是今天的内容啊,我们64位汇编入个门啊,明天呢,我们还是讲64位汇编有问题呢,现在问一下,然后呢,这个有需要加群的可以联系咱们的这个小助理啊,有这个需要这个呃,咨询其他问题的也可以联系小助理,也需要获取什么工具源码视群的啊都是啊,联系小助理也可以直接加入咱们讨论群啊好,那么看一下有没有问题啊,没有问题的话,咱们就换这个小助理回来了。
我来说两句