版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。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]

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

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

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

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

这里可以看到,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]

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

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

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

执行STOSW

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

执行STOSD指令

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

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

执行前两步代码后如下:

执行REP STOSD

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

接着看REP MOVSD

执行前两步代码如下

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

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

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

执行REP MOVSD指令

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的更多相关文章

  1. 常用的汇编指令 movs stos

    movsb   把寄存机esi所存的地址的数据以字节复制到edi movsw  把寄存机esi所存的地址的数据以word复制到edi movsd   把寄存机esi所存的地址的数据以dword复制到e ...

  2. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  3. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  4. 汇编 指令lodsb,lodsw,lodsd

    知识点: 汇编指令 lodsb,lodsw,lodsd 一.汇编指令LODSB //scasb scasw scasd //stosb stosw stosd 1. __asm lodsb //作用 ...

  5. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  6. 学习linux内核时常碰到的汇编指令(1)

     转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...

  7. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  8. Objdump-查看汇编指令

    作用 Objdump可以用来看汇编指令 查看汇编指令 测试文件 编译指令 gcc -g -o objtest 1.8.c objdump -S objtest |more /main 查看结果

  9. ARM汇编指令(未完待续)

    ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...

随机推荐

  1. Ajax错误

    如果ajax访问不到后台对应的controller的方法,直接报错,首先查看url访问路径,如果路径没错误,再利用谷歌开发者工具来运行一下,是否存在基本语法错误,比如字符写错了,多一个少一个逗号, 如 ...

  2. IDEA设置默认WorkingDirectory

  3. Linux—运行yum报错:No module named yum

    产生原因:yum基于python写的,根据报错信息提示,是yum的python版本对应不上目前python环境的版本导致的.也就是说 有人升级或者卸载了python. 解决方式: # 查看yum版本 ...

  4. [视频教程] 如何在Linux深度系统deepin下安装docker

    笔记: 安装docker的命令 curl -sSL https://get.docker.com/ | sh service docker start 排查错误的命令 strace 视频地址在此:ht ...

  5. 开源敏捷测试管理& 开源BUG跟踪管理软件itest(爱测试) V3.3.1小改紧急发布及正实现功能预告

    v3.3.1 下载地址 :itest下载 码云源码地址 https://gitee.com/itestwork/itest 开源中国  itest项目地址   https://www.oschina. ...

  6. win10连接共享打印机

    一.在运行中输入“\\共享打印机的主机ip”. 二.如果出现下面弹窗: 1.按Win键弹出开始菜单,直接在键盘上按zucelue,这个时候开始菜单里会检索到“编辑组策略”这个程序,按回车运行该程序.2 ...

  7. 2. Linux文件与目录管理

    一.目录与路径 1. 相对路径与绝对路径 绝对路径:路径写法[一定由根目录 / 写起],如:/usr/share/doc 相对路径:路径写法[不由 / 写起], /usr/share/doc 要到 / ...

  8. NOI2015 软件包管器

    NOI2015 软件包管器 https://www.luogu.org/problem/P2146 题意 维护一棵树,每个节点都有一个为0或1的值,初始值全为0 需要支持 将一条链上的点都变成1, 将 ...

  9. 【西北师大-2108Java】第四次作业成绩汇总

    [西北师大-2108Java]第四次作业成绩汇总 深入理解程序设计中算法与程序的关系: 深入理解java程序设计中类与对象的关系: 理解OO程序设计的第2个特征:继承.多态: 学会采用继承定义类设计程 ...

  10. ini_set()

    ini_set ( string $varname , string $newvalue ) : string 设置指定配置选项的值.这个选项会在脚本运行时保持新的值,并在脚本结束时恢复. 参数 va ...