00:01
喂,好啊,那我们开始今天的学习,我们首先把昨天之前一直用那个项目打开啊。昨天本来应该讲的就是今天的内容包括在内啊,但是因为时间不够了啊,所以就分割了,把这个切出来了,今天讲嗯,今天呢,主要呢,我们来讲一下这个数组啊,数组数组的一些常规操作,那我们还是来搞一个Excel啊。好,那我们首先呢,我们之前学过了一些这个变量类型,比如说我们的这个呃,DB啊,然后这个D,呃,内存啊,内存长度啊,我把它这个。
01:05
加上一个格啊,那比如说我现在呢,有一个零地址,这个位置是个零啊,那么这个位置呢,就是一啊,这个位置呢就是二啊,这个位置呢就是三啊,这是45678啊就是这么多啊这么多,然后呢,这么个一个地地址啊,那我们现在呢,比如说我现在有一个这个DB啊一个DB,那么这种情况下呢,我一个地址它是多长呢?就是这么长啊,就是一个占了一个格啊,就是零,如果是DW呢,通常情况下呢,它就是16位嘛,16位就两字节啊,它就两格啊,那然后呢啊,如果是32位呢,32位就是这个呃四字节啊,那就到这啊,那如果是八位呢,D呢啊就是站到这个我们这边啊到八这啊一共是到这个八个字节啊,这是它的一个数据长度问题啊,那我们除了数据长度之外呢,今天呢,我们还要研究一个新的类型啊,就是也不算新的类型啊,就是技术类型之上的一个东西叫做数组。
02:06
啊,数组呢,在这个不同的编程语言中呢,有着不同的这个定义啊,它的这个方式也不一样啊,它那种能容纳的东西也不一样啊,比如说什么Python之类的,还有类似于什么元组啊之类的东西啊,啊还有一些有语言,有什么字典之类的东西,但其实呢,都是这个很类似的东西,但是他们能容纳的东西都不一样,那你像是我们在汇编里的数组呢,就是非常单纯的数组啊,它是什么呢?由。啊,同一类型啊,这个变量啊,组成的集合啊,由同一类型变量组成的集合啊,那这个是什么意思呢?就是说你一个数组啊,声明的数组的以内的东西啊,全都是一个类型的,比如说你声明了一个DB的数组,那你这个数组里所有的这个元素都是DB的,如果你声明一个DW数组,那你们这里边的元素都是DW的啊就这个意思,那怎么去声明这个东西呢?啊数鼠的声明呢,一般情况下呢,分为两种情况啊,一种情况呢,就是已经初始化的,一种情况呢,就是没有初始化的啊那你如果说是已经初始化的呢,你比如说你就可以给它写成这种类型啊叫什么这个呃,AR啊一然后呢,这是你的数组的名字,就跟你前面定义变量的时候,变量的名字一样认你数组的名字,接下来是你要定义这个数组的每一个元素的类型是什么,比如说它是一个DB的,然后接下来呢,除了DB。
03:34
这个D的类型好之后,那你后边跟的是什么呢?跟的比如说如果说你这个是一个数组,那你首先你要知道你里头多少个元素,多少个元素是什么意思呢?就是你上边这个写了啊,数组是由一一系列啊同一类型变量组成的集合,那么你这里边同一类型的变量的个数啊,就在这里定义,比如说我是由20个DB啊,20个DB来组成的,那这就写个20,然后20之后呢,接下来呢,你要用一个dup的一个关键字啊来给他这个呃定义啊定义完事之后呢,后边呢,跟一个括号,括号里边有两种形态,比如说你如果定义它出一个数啊,那比如说是一个这个啊,你要给它初始化成这个255啊,那你就给他写一个0FFH啊,这就是16进制啊,16进制啊,给它定定义成这个255了,然后呢,你这里头的元素就都是二五,那如果说你不初始化呢,你给他写一个问号啊,那里边呢,就是未知的这个初始值啊,这个就没有初始化啊,就这两种定义形式,那么我们说啊这个数组。
04:34
我们定义完之后啊,我们已经知道是这样定义数组的了,那么数组这个东西它是怎么样的一个形态呢?那么这个东西呢,实际上而言呢,数组的这个名字呢,更相当于什么呢?相当于一个起始地址。啊,起始地址,比如说啊,我这儿啊,零这个位置上啊,我存了一个这个数组啊,我这是AR1啊这是我的一个数组的一个起始位置,那么起始位置啊,那是个零,那我的这个数据宽度是多大呢?是DB,是这个一个字节,那比如说我就带着一个格,那我这里头啊第一个格存的就是我这个起始位置的第第零个元素啊,我们这个元素都是从零开始算的第零个元素,然后下一个是存的是什么呢?就是我这个啊这个第一个元素,然后第二个元素,第三个元素,第四个元素,第五个元素啊那也就可以看出它是一个什么东西了呢?啊我们数组在内存中是线性性连续的存储空间啊线性连续的存储空间啊,也就是说呢,你的这个呃存储呢,是连续的,那我们如果DB啊,DB是每个在一个字节连过来的啊这样。
05:50
比较科学,那么我们啊,比如说我现在我这个不是一个DB类型,那我是一个D类型啊,那它是怎么样来这个存放的呢?啊也是一样的,只不过它的长度有所变化,什么意思呢?就是我零的这个位置,它还是一个起始位置,但是我下了一个位置啊,下一个啊,这是加零第零的元素,那我下一个位置呢,就不在不在这个一这个位置上了,1234,我们DD啊,我们DD占四个字节啊,四个字节,所以下一个呢,在四这儿啊,所以说A1啊,然后加一的位置在这儿,然后再下一个呢在这儿啊。
06:28
所以我们可以总结一下它的这个位置啊,是怎么算的呢?实际上而言就是你的起始位置。啊,乘这个加上什么呢?加上索引啊,索引是什么呢?就是你第几个元素就是索引啊,第零个元素,第一个元素,第二个元素这种啊,就是索引,加上索引乘以什么呢?乘以类型啊,乘以类型长度啊,或者类型宽度啊,就能在内存中找到你所爱这个元素的一个位置了,那起始位置不用说了,就这个东西那类型,比如说我们找一个一啊,那一啊就是我们的这个数度,第一个位置如果是DDB啊,那么一乘以一啊,那肯定这个,因为DB是宽度,是一字节嘛,那就是在这个位置上,如果是DW2字节呢,它就在这个位置上,那如果是DB呢,四字节呢,就在这个位置上,如果是DB呢,就在这个位置上啊,因为是什么呢?因为这个一乘以这个八嘛,它就在这儿了啊,所以这个呢,就是它的一个内存存储的一个方式,以及啊,它是如何去寻找的啊,寻找它这个位置在哪的这么一个东西,呃,然后呢,如果有小伙伴需要这个前边的这个录播课以及工具,以及这个咱们的这个其他一些东西啊,这个就联系一下咱们公屏上。
07:40
的小助理啊,然后呢,加群啊之类的啊,还有这个可以直接跟他要录播什么的啊,然后我们接着讲啊,这个呢,就是我们的一个基础概念啊,基础概念我们首先了解一下这个东西啊,然后接下来呢,我们来写一下代码。
08:03
来我们这回的写的代码是什么呢?就比如说我这呢有一个数组啊,我我想给他进行一个用一个数组给它填充,或者说我就凭空给他填充一下啊,这个呢,经常在我们的这个高级语言的初始化的时候看到啊,这个高级语言的特C和加啊C和加加它初始化的时候呢,会给你开辟一段空间,把这个空间里进行一个这个。呃,给你刷成一个什么CC啊什么的之类的事情啊,那这种填充是怎么做的呢?啊,那我们其实呢,是有一类指令啊来给他做到的啊,那首先比如说我要给它都填充成CC啊,那我在这我给他操作一下啊,我把这个上面这部分啊给它去掉。我和我们的。诶,Sts系列啊,Stsbs to,呃,Sts这个呃,W和s to SD。
09:11
我看看有没有这个STQ啊,我们看一下啊。STOSTOS。全搜索我们看一下啊,在这啊,你看这是字符串存储指令啊,然后啊,它应该是有。它这一是一系列指令啊,但是这个东西版本有点老啊,好像没怎么写啊,我看一下有没有D版本啊,啊也没有啊,它这个同样指令只有嗯,它没没没没什么差别,这些指令啊,它是一个系列,它这个后边这个BW和这个D是什么意思呢?实际上而言就是啊,一个字节两个字节,四个字节啊,如果不出意外,它应该是有个Q啊,应该是有个Q啊,那就是这个八个字节啊,那但我们用过那个指令啊,我也不确定真的存在不存在啊,然后呢,我们来看一下啊,我比如说我们现在想要充一块这个数组啊,我们怎么做,那首先呢,我们给他要填充什么,我把这个东西呢,我要放到什么呢?放到我的A,比如说我要给充。
10:11
啊,那呃0C啊,我要给它全都刷成CC,这就类似于我们这个C进函数的时候一个初始化,然后接下来呢,我已经把它这个CC放进去了,那么接下来就是什么呢?你要这个往什么地方啊,给它进行这个刷,刷什么东西,那刷什么东西呢?我们这个指令呢,有一要这个数,你的串里这类这个这类字符串操作,或者说这类这个数组操作的这个令呢,它通常会对你的EE进行操作,那像这个这个指令呢,就是要取你EDI的数组,然后进行这个填充,那我们首先呢,要定义一个这个数组啊,那这个数组呢,我们给它。
11:01
起个名target。然后我们定一个这个DB还是定义DD呢?嗯。其实无所谓啊,我感觉啊,这个DB还是DB,好像我们刷起来反正一个感觉啊,要不定个定个。啊就就就DB吧DB吧,然后我们给他定义一个20的dop,我们给他定一个未初始化的啊这样然后接下来呢,我们就开始给他搞啊,我们首先要把它这个地址给取出来,放到我们的EDI里啊,那就是move EDI啊,然后over over啊,然后一个这个target啊给它放进去,放进去之后呢,我们EDI里就有这个数组的一个起始地址了,然后呢,我现在呢,有要刷新的东西了,那接下来我要给他这个进行这个操作嘛,那比如说我现在呢,有要要来一个这个ste字节啊,因为B嘛,一个字节嘛,那我们现在呢,可以先来这个给他测试一下啊,测试一下啊,我们这下个断点,然后给他项目重新生成一下。
12:14
好可以了啊,可以之后呢,我们就给它运行啊,运行起来。好,断在这了啊,断在这儿了之后呢,我们现在呢,首先看一下啊F10走一步啊,Al里边已经有这个CC了啊,看到没,已经有CC了,接着呢,Target我要给到EDI里边啊,那现在的EDI的值是这个,我再走一步,EDI的值已经变了,变完之后呢,我现在要干什么呢?我要去这个看一下我这个地方的值啊,我切换到内存这啊,然后呢,用这个取地址符啊,把这个地址取出来啊,类似于欧赛的一个作用,然后呢,现在我到了我这个地址上,你可以看到啊,是FF5003啊,跟我们这个EDI上的地址是一样的,接下来呢,我进行数据传送啊,然后直接一个F10啊,然后你可以看到我有一个字节就变成CC了啊,那这个呢,就是这个这个的一个作用啊,这个指令的一个作用,但是我们这个指令啊,如果说是只能搞一个字节,那么你是不是想到了,我们如果要把它这个数组里的这个20个元素全部填充上,是不是需要这个循环啊,啊,那实际上而言呢,我们用循环确实可以做到这件事儿啊,比如说我们写一个loop,或者用GCC指令。
13:21
请实现一个啊,然后循环20次,把它的这个后边全都给加了,然后呢,就是还要写一个什么呢,地址的移动啊来为移啊,那但是呢,我们实际上而言呢,在汇编里头呢,有是有更方便的这个指令来实现这一点的,比如说我们可以加上一个什么样的前缀呢?叫做RP啊,重复执行前缀啊,这个I行缀的意思就是什么呢?就是多次执行这个,但是啊,但是你需要注意1RX数值很大啊,那可能就无限循环了,所以说呢,在这儿呢,你定要给它进行一个赋值操作,比如说我现在给他move啊,Move e cx啊,我就给他让他循环20正20个元素都了,我现在呢给充完。
14:21
重新正常之后呢,我们运行啊。好走,首先al啊变信息了啊,然后呢,我们ECX啊变成14了,接下来啊,Off啊这个啊,这个target啊到EDI里啊,这个地址也变了啊,然后我们直接把这个地址拖,呃,拖一下EDI吧,啊把EDI拖过来。好,你看啊,他就过来了,过来之后,那我们就看这个地址啊,然后呢,我们现在上一次呢,因为我们只是一次执行啊,所以说他只有第一个字节被影响啊,现在呢,我们直接重复执行20次啊,然后我们走,走完之后你可以看到啊,你看到。20个啊,都被填充了啊,它这个东西自动后移的啊,就是每次操作完之后,它不是操作了一个字节吗?操作完一个字节之后,自动会往后移一个字节啊,比如说我们现在是这个,嗯。
15:09
看一下这边啊,我们现在比如说我现在走的是这个。S tost这个指令啊,那我正常指令呢,我操作完之后呢,就是在这里边填个CC啊,然后呢,我因为我现在呢,是一个这个Rep的一个Rep的这个s to sb啊,那所以说呢,他在填完第一次啊,第一次之后,因为它是受这个ECX次数影响的嘛,啊那所以说呢,比如说我们ESEC等于这个八啊,我就终于把第一次执行的时候,这个填七息,然后往后一直填第二次执行第三次,第四次,第五次,第六次,第七次,第八次啊就这样啊,第二去执行,执行到第八次的时候,因为ECX啊,它每执行一次ECX的值就会减一啊,减到零的时候呢,就停止执行,执行到下一条了啊这就是重复,重复前缀的一个作用,那像是我们这个重复前缀呢,它不单单可以用在这个指令上,很多很多的指令呢,都可以使用这个重复前缀来反复执行啊。
16:07
好,那我们说完这个指令之后呢,我们已经知道啊,这个指令怎么用了啊,这是一个填充类型的啊,它实际上不是填充啊,但是我们就当它填充用,因为呢,它本身的这个功能呢,跟我们关系不大啊,我们用它的时候,一般情况下都是用来用它来做填充的,那我们这种方式学完之后呢,我们再来说这个其他的一些东西啊,比如说啊,我现在呢,呃,想要手动啊,想要手动给他这个进行一下这个填充啊,我们实验一下这个我们寻址,因为我们刚才讲了寻址啊,但是我们这种填充方式呢,实际上并不需要我们自己去寻址啊,它是自动寻址的,那我们如果想要手动寻址给它,把数组给它填充起来啊,那怎么做呢?啊,其实也很好办啊,比如说我们现在呢,就是还是给他。嗯,我想想啊,嗯,我们怎么做啊,首先我们。我们首先给它,呃,把地址取出来啊,放到EDI里啊,这点嗯,不放e Di里,我给这个清一下啊,然后呢,把上面都去掉,我给它用这种寻址的方式啊,比如说我给它放到EAX里,然后呢,现在我target一个地址呢,就在这个target的一个数组地址就在一些exx里了,然后放到EAX里,之后呢,我现在的ex实际上相当于数主手地址。
17:25
就相当于我这个位置啊,这个零的位置啊,这个数值手地址这个位置现在我相当于A,然后呢,我EAX在这儿了之后呢,那我还缺什么呢?这起始位置有一个E了,那我是不是还得加上一个索引乘以数据宽度啊,那所以说呢,我现在呢,就要来找他的这个索引和数据宽度的一个问题啊,那比如说我现在第一个。Move啊move啊,然后呢,括号啊,这是这个括号是个什么东西呢?这个括号呢,是一种叫做间接的东西,比如说我们现在ES有个。我给大家画一下啊,比如说我这个这个东西,这个东西的作用啊,比如说我这有一个ES,那这个时候比如说我的ES等于12345678啊,那这个时候我的这个括号的意思是什么呢?就是啊我要去取12345678这个地址上的值啊,这个这个就会被当做地址,括号里的东西会被当地当成地址,然后呢,去这个地址上寻找它的值,比如说我这个括号里边啊,我是个八啊,是个八啊,是个七,是个七吧,我这个括号里是个七啊,那我就是说要去这个七这个地址上去寻值啊,那我地址是七,那我值是什么?是C,那么这个时候出一个东西,比如说我现在写一条啊啊E后E,那这种下出的实际就是什么呢?这个E啊,行完之后E就C啊,这是一种方式啊,一种方式啊。
18:57
然后呢,我们这种方式讲完之后呢,我们现在,我们现在呢,起地像起E代表我是什么呢?我现在这么写法是我要拿到什么,我数组的第零个元素,要拿到我数组的第零个元素,然后呢,我回来之后,我现在呢,要加的就是索引和什么呢?索引和它数据宽度,那我现在索引肯定要自己再做一个从零开始的一个索引,对不对,那我就是比如说我要这个给它清零一下,我用一个X啊,这个是我们上节课学的抑或指令啊,我们抑或什么呢?EBX和EBX,那我这样为什么说这样就可以进行清零呢?那大家记不记得抑或是什么呀?啊不一样就为零啊,对不对啊。
19:40
不是那个抑或呀,那个那个两个数,你抑或之后不就等于零吗?啊,这个我给你们用计算器啊,给你们看一下啊。啊,我操点错东西了。比如说啊,我现在呢,有两个数啊,我有一个123啊,不是125,然后呢,我给它按位进行什么呢?进行抑或我在抑或一个212125,然后我一等,诶你看是不等于零了,按上节课我们已经讲了预算方法,它是不是等于零了,那所以说我用这种方式啊,可以就给它清空啊,它的作用呢,实际上如果说啊,不出意外的情况下,是和木E一个零啊是一个效果的,但是实际上你这么负零啊,它是有一定几率出现问题的,但是几率不大啊,这个我们后续来讲为什么会出现问题,但是你抑或它是根据数据宽度来的,它绝对不会出现问题啊,它会给你全都清成零,那这样呢,我们就有一个从零开始的一个索引了,那有这个索引之后呢,我现在呢,就要给他啊,加上这个索引啊,我们在这个32位里啊,它加了一个叫做比例因子的东西啊。
20:49
比比例啊,比例因子的这个东西啊,这个这东西加上之后了呢,就可以允许我们在这个寻指的时候用上加减乘除这类东西了啊,那比如说我现在啊,我在这里头啊,我直接啊给它加上啊,加么E上我的E啊,就这种操作方式是支持的,那么在以前呢,我们只能用指令啊,比如说我们先给EA上ADSE,然后呢,再给它括上,然后再去取值啊什么的啊,那样比较麻烦啊,现在呢,我们可以直接在里边写E加上E,然后我们要什么呢?我们这个E只是一个索引啊,01235678的一个索引啊,那它还要加上一个数据度啊,那数据度是多少呢?啊,那我们现在呢,一个数据宽度是一个DB啊,DB也就是多少呢?也就是一个这个一啊,那所以说呢,其实现在我乘可以乘也可以不乘啊,就无所谓,那为了实实明显,我们把个DD字啊,这样看着就比较清晰度啊。
21:49
这个是不是就是我们刚才提到过的这个扩这个这个公式,起始位置加索引乘以数据宽度这个东西,然后呢,我们称了之后呢,我们就要给它里套赋值啊,那赋值什么就对,那比如说我们现在就把的引次的去,就么种式给它值去,但是我们现在的ex是没有自增的啊,所以说呢,我要在这啊给它加上一个自增啊,比如说INC一下E,接着呢,你要给它形成一个跳转,让它循环的给它值,那比如它有20个元素,那你就要给它赋值20次,那这20次呢,我们可以用这GCC指令,也可以用loop指令,但这呢,我们用loop指令呢,比较方便啊,所以说我给它17X赋一个20,然后呢,我直接一个loop啊,然后跳一个LP,接着呢,我在这个位置上给它,我看我给它跳到哪呢,跳到跳到这吧,比离因子上面正好,要不然的话它EBS就不轻了,然后LP啊,我这一跳转跳上来了,这样呢,就形成了一次这个负值啊,那我们来看一下啊,我们来看一下。
22:49
我们创新商城。好,那我们在起始位置这个位置,我下个断点啊,然后我运行。
23:05
好在这断下来了啊,然后我F10啊ECS变成幺四啊,然后target的地址放到ES里啊,你看ES地址变了,变完之后呢,清空EBS啊,你看EBS现在的值,然后呢,你看啊,EBS0了啊,如果说你在真实写的时候,最好把这个EBS保存一下啊,但是现在呢,我们不用保存,因为我们这里边我们知道没什么用啊,如果以后呢,在写写一些项目的时候,我会告诉你为什么要保存起来啊,然后呢,我们现在呢,就往下走啊,EAX加ebx乘以四,然后呢附一个EBS,那是收这个时候呢,我们就来看一下这个EBI没有EBI啊EAX上这个地址啊,我们把ex地址拖到我们的这个这里边啊,然后现在来观察它,那接下来啊,我们就走。F10走一步啊,你可以看到啊,它负了一个零,因为负的是零,所以说这边是没有看没有变化的啊后我们现在ES是什么呢?ES是零啊,然后呢,我接下来啊,走自增EBS等于一啊,我跳转回去,跳转回去之后呢,我的ECX减一啊变成13啊,13之后呢,我现在呢,再给它一个值啊,你看这有就有变化了啊,那它就变成了一啊,那实际上这儿呢,赋值的是一个赋值的一个零啊,为什么看不出来呢?因为它没有变化,所以说看不出红来啊,但是现在呢,我们赋值这个一啊就看出来了,并且它证了一个我们刚才讲过的理论,就是我们的数啊加上什么,加上索引,然后呢,乘以数据度啊,我们的DD是一个四字四字节的,你可以看到它下一个数组啊,这个下一个元素的负值就在四字节之后,那下一个就在这个位置上面,我们来看一下啊走走走诶,你看是不是在这个位置上啊,那复制这个二,所以说呢,你现在呢,你可以看到啊,给他这个进行一个填充啊,67890ABC啊,然后什么这个。
24:49
D啊,F10111213。完事了啊,看着没这个呢,就是我们使用这个比例因子的方式,自己手动对它进行一个赋值啊,从数组索引加上这个数组起始位置加上索引在乘以数据宽度这种方式对它进行一个赋值,这种方式呢,比我们填充那些东西呢要灵活,因为你可以随时找到它的任任意一个位置上的一个数据,比如说你想到这个数据啊,那就直接把E对,那你取往外取值的时候也是这个,比如过来啊,你比如说你写一个这个啊,这个E,然后呢,给它写一个什么E加上E啊,然后乘以四啊,那这样是不是你可以任意一个位置出来,只要你在上给这个E一个你想要的数字,然后就把它任意的一个元素出来不。
25:45
啊,这个就是它的一个复制一个取值一个问题啊,那这个东西呢,除了我们可以这样搞之外呢,如果说比如说你想这个给他这个按顺序给它取值啊,你除了这种啊手动的方式给它挨个取一遍,就是我们再给它在底下再循环一遍,然后让他这个把它每一个元素都给取出来之外呢,我们有一个指令啊,也能完成类似的事情,那就是什么呢?就是一个叫做这个呃。
26:10
Load啊,Load的系列的一个东西,你可以看到这有什么load s load sb load SD啊,Load SQ load SW,实际上跟刚才一样啊,LD是它的真正的指令啊,啊应该说DS是它真正的指令,后边的BDQW是什么呢?是它的这个数据宽度啊,你像这B呢,就是八位,D呢,就是是这个32位,Q呢是64位啊,这个W16位啊就这个意思,那现在呢,我比如说我现在呢,这是一个ddd的,那我们现在呢,就是要什么呢?漏的SD啊漏SDSD呢,我们这个东实际上出了一个元素啊,但是我们可以来看一下,我们在这个置下一个点,然后呢,我们新生一下,让直接行到这呢,我就不等了。我把这个这个断点取消啊,然后我们来运行。哎,你看断在这儿了啊,断在这之后呢,我们现在呢,来这个ES,也就是target上边我们来看一眼。
27:02
看到在你在你target这样呢,它就不会没啊,因因为你这个一会儿E的值就要被覆盖掉了啊,那现在呢,我们给他来一个这个F10走一步啊,走一步之后你可以看到诶,我们取的出来是什么东西。SD,然后。哎,我是。漏S啊啊哦哦,我我们漏SD,我们要指定那个取的这个元素啊,我们现在没有给他指定啊,我我们对了啊,我想起这个东西,你也要给操作那个E和EI,但是我们现在没有给他指定啊,所以说他出现问题了,我们现在呢,要首先给move啊,到EI里操作才能操作啊,把他的这个target啊off target放到esi里,然后呢才能操作啊,刚才忘了,然后给他重新生成。
28:15
来运行。然后呢,把这target先放在这儿啊,然后看一下他这个地址里边的内容啊,现在呢已经是有内容的,然后我这个ES是这么一个起始地址,然后我现在呢,要给他F10一下,诶,你看它E是不是取出来的就是一个零了啊,就这么一个作用啊,然后呢,如果你给它加上一个反复取出的一个缀,或者给它加上一个环啊,你就可以给挨个取啊,比如说我现在呢,我在这儿再给他写一个循环,比如说我再写一个loop啊,我loop一个L2,然后呢,我在上边给它加一个L2。啊,就执行这一个SD的功能啊,那其他的我都不都不行啊,那我重新生成一下。好运行啊,运行之后呢,我们比如说我第一次啊,我现在执行啊,你看我EAS,然后呢,我再把它这个target放下来,我走一步。
29:07
你看我现在取的是零啊,然后呢,我再走诶你看我取的是一再走,取的是23456789是abcd,可以看出来啊,我们漏SD和我们的前面那个指令是一样的啊,它在取完一次之后呢,它会自动的往后移啊移一个数据宽度,什么叫移一个数据宽度呢?比如说你这个是这个LDSD,它就往后移四个字节啊,就是你这个esi上的这个位置esi上这个数组啊,就往这个往址移四个字节,如果是这个S的话,它就是什么呢?就是移两个字离一个字节,如果是S况下呢,就是移两个字节SQ就八个字节啊,它这个自动后一页这个是啊反复操作好,那么我们现在呢,就已经啊知道了啊这种方式啊,那除了这种方式之外呢,我们应该,嗯,我想想啊,这个还要讲啥来着。让我想一下啊,还有还还我记得还有内容来着。
30:03
嗯。感觉好像有,感觉又好像没有。啊对,我们应该还讲那个数据的那个叫什么来着。嗯。我应该还讲数据的。啊对,还有数据传送啊,数据传送最常用的差点忘了啊,我们还要讲一个数据传送。木S啊S系列。啊,这个木S系列啊,你可以看很明显的看到啊,它后边也跟了一系列的东西啊,包括木ssb木SW这种的啊,然后底下还有对比系列啊,就是什么西安啊,西安PSB啊这个东西啊,一会儿我们也看一下啊,那MOS系列呢,很明显它是一个字符串传送指令啊,或者说也你可以叫数主操作指令也无所谓啊,反正它跟字符串是密切相关的,然后呢,我们现在呢,来这个使用一下它,比如说我现在呢,有两个这个变量啊,我现在有两个变量,我要给它进行一个填充。
31:15
那比如说我现在呢,有一个target了啊,那这个target呢,我们给他,嗯,就这么着吧,就四字节吧,我再给他来个。DD20DUP,然后呢,我给它初始化一下0FFFH啊16进制好,然后呢,我现在呢,要把这个我这个原理的东西完整的拷贝到这个target里啊,那我现在呢,要怎么做这件事儿呢?啊,我现在把我的这个以前的代码先给它删掉,删掉之后我现在要这么做,首先啊,我要目一下啊,目一下什么呢?它这个木S系列啊,这个里边它的操作数在两个寄存器里,在esi和EDI里,把原作拷E,拷EE。
32:06
So啊,然后呢,我们在move e Di啊O诶,忘记逗号了啊over啊,然后TT啊,现在呢,我们就给都放过去了,放过去之后呢,我们接下来呢,要进行什么呢?SD啊,那首先呢,我们也不重复操作,我们先来一次单个的这个SD,我们来看一下啊,我们重新生成。好,下个断点啊,然后我们运行。我E。现在这里边是没有值的啊,前四个字节是空的,然后我现在走一下啊,走一下F10诶,你看它是不是传送了一个四节过来,对不对啊,传送了一个四节过来啊,这个就是从这个元里边啊,传送了四字节到我们这个target里边啊,通过这个指令,但是我们现在呢,只是一次操作,那比如说我要把这个20个元素填满的,那你就加上一个IP重复执行指令,然后呢,再给他一个次数啊,Move啊,然后ex我们给他一个20啊,因为它这个填充是20个元素嘛,所以说我们要给它反复执行20次啊,这个跟前面的指令一样啊,它也会导致你的这个里边的值自动地址自动往后移啊,移这个数据宽度位啊,好,那么现在呢,我们重新执行。
33:32
运行。好走走啊,现在我们要执行了啊,那我现在呢,还是去观察这个target它的内存啊,我们这里边可以看到现在全是零啊,然后我们现在重复执行24之后,我们来F10,你看啊,20次啊,20次20次四个字节啊,把这部分全部填充,看到没,全部填充上边这部分是啥?这部分是圆啊,这部分底下红的这部分就是刚才被覆盖的target啊,这就是我们的这个数据传送的一个作用啊,也可以叫数据拷贝啊,也可以叫数据传送啊,这个就是随你高兴,那我们这个就是一个四字节版本的啊嗯。
34:07
我看一下。我们接下来。我们接下来还可以给他来做一个比对啊,我们刚才看了一个那个CMP那个东西啊,CP这儿还有CMP对比啊,那我们给他写一个这个对比啊,那对比呢,这个呢,我们拿两个拿两个数来对比一下,也可以拿两个这个字符串对比啊,都可以啊,就看你那个反复对比它的那个次数嘛,然后比如说我现在DW啊,SOC啊,然后DD。嗯,比如说我一个1234啊,然后呢,我DW啊,然后TT啊,然后也来个DD1234H,好,那这个呢,就是两个数啊,两个数我就我现在要对他们进行一个对比啊,那怎么操作呢?啊,其实呢,跟我们那个这个字符串那边差不多啊,跟字符串那边差不多,那我们现在呢,就来给他传送啊,把这两个东西传送到我们的这个沐浴串和这个圆串里边啊,因为对比还是要用这两个地方。
35:23
好,这样呢,我们就给它填充进去了,填充进去之后呢,我们现在呢,要来一个什么呢,又来一个西P系列指令啊,西P后边你可以看到啊,还有很多很多的这个,呃呃,这个元素啊,因为这个叉MM这种呢,就是浮点数的一个那个计算了啊,那我们现在用CMP本身呢,它是这个也是一种对比,那我们要对比字符串呢,我们要对比这个CPS系列,那我们可以看到有S什么呢?Sb SD siq ss和S啊,它还是一个这个数据宽度的一个问题,那我们现在呢啊,比的是两个DD,我们西D可以了,那西SD这个东西呢,实际上呢,跟我们前过西是非的一个东西啊,我们看一下CS这个东西啊,它也是会对这什么呢,对我们的标记位啊造成影响啊,然后呢,你就可以对这个标记位啊,这个进行判断啊,然后来看它是不是这个一致啊,比如说我们CP这个SD对比完之后,如果他们俩一致,你的Z肯定是等于一的啊,这Z定等于一的啊,所以。
36:23
可以这么做,比如说你现在用一个G啊,G进行一个跳转,那G跳转如果说这个。我想想啊,如果说一致啊,一致的情况下,我们比如说我们给他跳一个RP。我给他最后啊跳一个LP,然后啊木啊,如果走到这个分支啊,嗯,走到这个分支,我给E复制一个一啊,然后呢。占到我们的这个N的L上啊,把它N的一吧啊NR的话可能出问题在这,然后呢,给它复制,如果说跳到这儿,说明这个是相等啊,然后呢,我们是不同的。
37:06
我们给他木一个零,Ex一个零。然后呢,我直接顺着就往下走了啊,那也就是说呢,如果是这个不同的啊,我们会走到这儿,相同的会走到这儿啊,然后呢,如果不同的直接跳到这个结束这了,如果是啊,不对,不同的就跳到结束这啊,如果是相同的就顺着走到结束这啊,然后最终你看ex是一还是零,就能看判别它是这个一致还是不一致,那我们把断点下在西PSD上啊,然后呢,我们重新生成一下。好先好好了啊,然后我们重新运行,运行之后呢,我们现在呢,已经有东西了啊,那么我们现在先PSD啊,我们直接F10一下,F10之后呢,实际上它对这个我们的flag位已经造成了影响,这影响之后呢,我们现在GZ啊GZ我们走诶你看它就跳到这边来了,说明什么,说明它相等啊相等,相等呢就会跳到这来给e as4个零,然后呢,结束啊,你看现在EAS是个零,那我们稍微改一下,我们把这个四字节呢,比如说改成一个1234和1231,然后呢,我们重新生成一下。
38:17
运行。再用G转,你看就这个E,我这字节之外呢,你看可以对比一个字节,然后呢,你反复执行啊,然后你就可以知道你的字符串是不是相等啊,你的数组是不是相等,你的元素是不是相等,其实你都可以用啊,就是各种各样的对比指令啊,那这些呢,就是我们今天主要要讲的几种啊嗯,好,那么咱们今天的技术部分呢,基本就这么多啊,然后有什么问题你们现在就问啊,如果没有问题呢,咱们就换人回来啊。
我来说两句