汇编指令之STOS、REP

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。23:28:13,23:28:19
作者By-----溺心与沉浮----博客园

STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元

  STOS BYTE PTR ES:[EDI]       简写为STOSB

  STOS WORD PTR ES:[EDI]           简写为STOSW

  STOS DWORD PTR ES:[EDI]     简写为STOSD

具体是AL/AX/EAX那就要看具体的宽度是多少,STOS指令同样受D位的影响(Direction Flag),当D位为1的时候,EDI的值会减,当D位为0时,EDI的值会加,前面的博文中有讲过,MOVS指令也是受D位影响

之前在往内存地址中写入东西时,都是用的DS:,这里用到EDI时,统一使用ES,段寄存器,还没涉及,暂且就先这样记住

  MOV EAX,12345678

  MOV EDI,18FF8C

  STOS DWORD PTR ES:[EDI]

  STOS WORD PTR ES:[EDI]

  STOS BYTE PTR ES:[EDI]

汇编指令之STOS、REP_第1张图片

 

 按下F8,执行STOSD指令,仔细观察EDI的值

 汇编指令之STOS、REP_第2张图片

可以看到,在执行完STOSD指令后,EAX里的值往EDI所代表的地址编号里头写入后,EDI的值减去了4,再来看看STOSW,STOSB

 汇编指令之STOS、REP_第3张图片

可以看到,执行完STOSW指令后,EAX里的低16位往EDI所代表的内存编号中的低16位写入后,EDI的值减去了2,由于我们代码是连续执行的,这一步的EDI的值用的是上一步EDI的值减4后的值,也即0x18FF88

再来看看STOSB指令,接着按F8代码往下走

 汇编指令之STOS、REP_第4张图片

这里可以看到,EDI的值0x18FF86减去一个字节后变为0x18FF85,再将AL里的值写入EDI中

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。23:28:13,23:28:19
作者By-----溺心与沉浮----博客园 

 

 我们将Direction Flag的值更改为0,在执行下述代码

   MOV EAX,12345678

   MOV EDI,12FFC4

   STOS BYTE PTR ES:[EDI]

   STOS WORD PTR ES:[EDI]

   STOS DWORD PTR ES:[EDI]

 汇编指令之STOS、REP_第5张图片

执行第一步,第二步代码后如下:

 汇编指令之STOS、REP_第6张图片

执行前不要忘记将D位置成0,我添加代码的时候忘记了,执行STOSB的时候更改回来了,接着执行STOSB,仔细观察如下:

 汇编指令之STOS、REP_第7张图片

通过观察,我们看到EDI的值加1,AL的值被写入到0x18FF70中,注意:只有低8位被写入!!!


执行STOSW

 汇编指令之STOS、REP_第8张图片

观察得知,EDI的值从0x18FF71加2之后,变为0x18FF73,观察内存区域的0x18FF70,可以看到,0x18FF71,0x18FF72中写入了,56,78两个值

 执行STOSD指令

 汇编指令之STOS、REP_第9张图片

EDI的值从0x18FF73加上4之后变为0x18FF77,如果读者你不懂为什么写入的形式是图中所示的形式,我建议你把内存拆分开来,用一个字节一个字节去看,然后画个图,相信你就明白了,你可以已0x18FF73为开始起点,4字节4字节的自己重新画个图,这时候,后面的内存编号就会是0x18FF77,0x18FF7B,0x18FF7F

 

 REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令

  REP指令会根据计数寄存器ECX中的值来指定次数,重复执行指令,注意:下面代码里MOV ECX,10,   10所代表的的十六进制的10,是十进制中的16

   MOV ECX,10

   REP MOVSD

   REP STOSD

 汇编指令之STOS、REP_第10张图片

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。23:28:13,23:28:19
作者By-----溺心与沉浮----博客园

 

执行前两步代码后如下:

 汇编指令之STOS、REP_第11张图片

执行REP STOSD

 汇编指令之STOS、REP_第12张图片

执行完REP STOSD之后,ECX里的值归0了,因为每执行一次,ECX里的值都会减1直至为0,观察图中内存区域,数一下,一共是写入了16次0x12345678,EDI的值也变为了EDI + ECX * 4。

接着看REP MOVSD

汇编指令之STOS、REP_第13张图片

执行前两步代码如下

 汇编指令之STOS、REP_第14张图片

执行REP MOVSD,啊哦,有点尬,还剩3次执行完的时候,我堆栈已经走到底了,,,

 汇编指令之STOS、REP_第15张图片

我重新打开一遍0D,执行一下REP MOVSD

汇编指令之STOS、REP_第16张图片

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。23:28:13,23:28:19
作者By-----溺心与沉浮----博客园

 

执行REP MOVSD指令

 汇编指令之STOS、REP_第17张图片

ESI与EDI都增加了ECX * 4,64个字节0x40,大家有兴趣可以将D位更改为1,尝试一下,REP STOSD,REP STOSW,REP STOSB, REP MOVSD,REP MOVSW,REP MOVSB指令

 

 1、用MOVS指令分别移动5个字节、5个字、5个双字

 2、用STOS指令分别存储5个字节、5个字、5个双字

 3、使用REP指令重写第1、2题

 嗯,这些都是本节将的指令相关内容,这三个题,博文中也有写,只不过,最多就写了2次,3次,大家可以用MOVS,STOS多写写,代替REP,等到写吐了,也就理解了REP了,这三题就不写了。

 

 版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。23:28:13,23:28:19
作者By-----溺心与沉浮----博客园

你可能感兴趣的:(汇编指令之STOS、REP)