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

  介绍完这些基础指令,后面就讲到汇编JCC指令了,我觉得介绍指令不应该只是简简单单的就介绍怎么用,汇编它其实也是高级语言,相信你读完我前面的文章就可以看到,我介绍PUSH、POP那节,都是用其他指令去执行PUSH、POP的过程,汇编它也由基础指令,高级指令构成,基础指令可以还原高级指令,加深对指令的理解,使得在分析程序时不再那么难受,还要想一想这个是什么过程,多练习练习,使其成为一种自然反射,久而久之就成一个熟悉过程了。

ADC指令:带进位加法

  格式:ADC  R/M,R/M/IMM   两边不能同时为内存  宽度要一样(R为register,M为memory,IMM为immediate operand)

  ADC AL,CL

  ADC BYTE PTR DS:[18FF8C],2

  ADC BYTE PTR DS:[18FF8C],AL

ADC其实与ADD差别不大,只不过ADC它是带进位的加法,我们来看OD中操作的过程,我们先将C位,置位1,添加左上角的代码

按F8执行代码至下图所示,EAX里的值为1,ECX里的值为2

我们再次执行ADC AL,CL这行代码,F8往下走

我们执行ADC BYTE PTR DS:[18FF8C],2

按F8执行完上述代码如图所示

我们发现相加2之后   0x0018FF8C里的值从75F2338A变为75F2338D

我们再来试试与寄存器相加的情况

  MOV AL,1

  ADC BYTE PTR DS:[18FF8C],AL

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

按F8执行代码如下图所示

0x18FF8C里的值加上AL的值之后从0x75F2338D变为0x75F2338F

SBB指令:带借位减法

格式:SBB  R/M,R/M   两边不能同时为内存  宽度要一样

  SBB AL,CL

   SBB BYTE PTR DS:[12FFC4],2

   SBB BYTE PTR DS:[12FFC4],AL

执行完SBB AL,CL指令后如下所示

发现EAX里的值为0x01

  SBB BYTE PTR DS:[18FF8C],2

  SBB BYTE PTR DS:[18FF8C],AL

这两行代码请读者自行尝试,笔者这里就不贴图了,介绍后面的指令

XCHG指令:交换数据

格式:XCHG  R/M,R/M/IMM   两边不能同时为内存  宽度要一样

   XCHG AL,CL

   XCHG DWORD PTR DS:[12FFC4],EAX

  XCHG BYTE PTR DS:[12FFC4],AL

执行完代码后如下所示

MOVS指令:移动数据  内存-内存

movs指令是汇编少有的两边都可以是memory的指令,MOVS在开发中通常极有可能是一串字符串的复制

  BYTE/WORD/DWORD

  MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]        简写为:MOVSB

这行代码的意思是从ESI里头的值代表的内存编号中取一个字节的值放到EDI里的值所代表的的内存编号中,其指令可以简写为MOVSB,后面的word与dword相同

  MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]          简写为:MOVSW

  MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]          简写为:MOVSD

我们已4字节的DWORD为例:如下图所示

我们去内存区域中随便找一块地址,这里我们将0x18FFB0给到EDI,0x18FFA0给到ESI,然后在指令输入窗口输入MOVSD就行,OD就会自动转换为箭头中所指的代码

按F8代码向下执行两步

再执行一步

仔细观察红框中所标记的,我们发现,执行完代码过后,ESI所代表的地址编号里的值给到了EDI所代码的地址编号中去了,然后ESI,EDI的值加了4,,我们再来看看MOVSW,两个字节的情况,看看内存区域与寄存器区域中ESI,EDI的值得变化,这次我们重新找块内存编号

MOV ESI,0x18FFAC

MOV EDI,0x18FFC4

MOVSW(OD会自动转换为MOVS WORD PTR ES:[EDI], WORD PTR DS:[ESI])

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

执行两步代码如下所示

再执行最后一步代码如下所示

我们可以看到内存区域中0x18FFAC中的低四位写入到了0x18FFC4中的低4位,ESI与EDI中的值分别加2。

我们前面博文中讲过EFLAG寄存器中的6个,还剩下3个没讲,那3个之前就说过我们后面有用到会再列博文来讲,今天我们MOVS指令就会用到其中一个,学汇编啊,买书看的效果不好就是这个,书就是归纳总结的结晶,前面呱啦呱啦总结一大堆,你没看个明白,到后面单独章节的时候就有可能忘记了,我们学汇编,用到什么就学什么,学透用透,这样才能把整体知识融会贯通

我们改变EFLAG中的D位的值,将其改变为1,再来演示一下MOVSD(MOVSW,MOVSB建议读者自行测试一下,是一样的),我们前面演示的MOVSD与MOVSW呢,EFLAG中的D位的值是0。

  MOV ESI,0x18FF98

  MOV EDI,0x18FFB4

  MOVSD

按F8向下执行如下图所示

我们可以看到之前ESI所代表的的内存编号0x18FF98中的值0x77529F72给到了之前EDI所代表的内存编号0x18FFB4中,ESI与EDI的值在D位为1的情况下,减去了4字节(读者有兴趣可以试试MOVSW,MOVSB)

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

汇编指令之ADC、SBB、XCHG、MOVS指令的更多相关文章

  1. 汇编实现: C库常见函数,串操作指令作用

    目录 汇编实现: C库常见函数 一丶汇编实现Strncpy拷贝函数 二丶loads实现Strlen操作. 三丶stos的作用 汇编实现: C库常见函数 一丶汇编实现Strncpy拷贝函数 void _ ...

  2. ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍

    要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...

  3. 王爽汇编第五章,[bx]和loop指令

    目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...

  4. 汇编 sub减法指令 比较指令CMP JZ条件跳转指令

    二.SUB指令 减法指令SUB (SUBtract) 格式: SUB A,B //A=A-B; 功能: 两个操作数的相减,即从A中减去B,其结果放在A中. 二.CMP 和JZ 指令 比较指令CMP 格 ...

  5. WebGL 在 OpenGL ES 指令 iOS 在 C 分歧版指令分析

    WebGL 中 OpenGL ES 指令与 iOS 中 C 版指令的差异简析 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途 ...

  6. AngularJs ng-repeat指令中怎么实现含有自定义指令的动态html

    今天用angular写table的时候,遇到了一个问题.在ng-repeat中,含有动态的html,而这些html中含有自定义指令. 因为希望实现一个能够复用的table,所以定义了一个指令mySta ...

  7. angular指令(二)--内置指令

    一.基础ng 属性指令:  ng-href ng-src ng-disabled ng-checked ng-readonly ng-selected ng-class ng-styl ...

  8. 汇编指令-MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用(1)

    1.MSR和MRS指令介绍 MRS 指令:  对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...

  9. 汇编,寄存器,内存,mov指令

    一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大 ...

随机推荐

  1. CDH预警配置QQ邮箱

    一. 在QQ邮箱中开启POP   二 .关闭主机的sendmail,开启postfix (本机若没有两个服务,就需要先安装)本地安装sendmail和postfix [root@Slave1 ~] ...

  2. [20190517]rman tape compressed.txt

    [20190517]rman tape compressed.txt --//前一段测试rman选择压缩备份时,如果备份单个数据文件小于64M-3*8K时,先建立大小64M文件,最后会回收到自己的备份 ...

  3. 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)

    题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...

  4. Windows文件夹共享和Unity的PersisterdataPath

    在共享机上存放unity开发的pc版本游戏,在其它机器双击就可以运行,但会遇到问题,比如: 游戏是需要下载资源的,默认情况下unity下载的资源是存放在persisterdataPath目录的,对于w ...

  5. 深度自编码器(Deep Autoencoder)MATLAB解读

    深度自编码器(Deep Autoencoder)MATLAB解读 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇文章主要讲解Hinton在2006 ...

  6. 如何在类中根据枚举值,获取枚举的message的工具类

    枚举类为: public enum OrderStatusEnum implements CondeEnum{ NEW(0, "新订单"), FINISHED(1, "完 ...

  7. 目标检测中的pooling操作

    1.SPPnet池化过程 假设这个feature map的尺寸是M*N*256,将这个feature map的每一个channel以4*4,2*2和1*1来划分格子,每个格子里面做max poolin ...

  8. day70_10_16drf组件响应模块,异常模块和序列化模块。

    一.解析模块 为什么要配置解析模块? 1)drf给我们通过了多种解析数据包方式的解析类. 2)我们可以通过配置来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析. 3)全局配置就是针对每一个视图 ...

  9. Python paramiko 报错 paramiko.ssh_exception.SSHException: not a valid RSA private key file

    报错的原因是选择的文件不是一个有效的 RSA 密钥文件 现在通过 ssh-keygen 默认生成的密钥文件是新的格式,并非 RSA 格式.打开文件可以看到是以 -----BEGIN OPENSSH P ...

  10. Fink| 实时热门商品

    HotNItems 拓展需求:实时统计双十一下单量,实时统计成交额,实时查看锅炉温度变化曲线,每个5分钟看一下过去一个小时温度变化曲线, 涉及到的技术点:sliding window.Watermar ...