汇编指令之ADC、SBB、XCHG、MOVS指令
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。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-----溺心与沉浮----博客园
最新文章
- 快速上手seajs——简单易用Seajs
- Java被忽略的基本知识(三)
- 三表联查,这是我目前写过的最长的sql语句,嗯嗯,果然遇到问题才能让我更快成长,更复杂的语句也有了一些心得了
- window.execScript的兼容性写法
- ruby正则匹配回车换行符
- JS中setInterval、setTimeout不能传递带参数的函数的解决方案
- Deep Learning: Activation Function
- cocos2dx中使用声音引擎需要包含的头文件
- node 裁剪图片
- 【JavaScript】我的JavaScript技术总结第一篇——编程细节
- 批量修改文件名java
- JS判断在哪个浏览器打开
- 【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party
- CSS Box Model 盒子模型
- 居中 html css
- vue 页面跳转的两种方式
- python在读取文件时出现 'gbk' codec can't decode byte 0x89 in position 68: illegal multibyte sequence
- a标签的使用
- BugPhobia进阶篇章:功能规格说明书
- 用ADO操作数据库的方法步骤(ZT)
热门文章
- [20190821]关于CPU成本计算.txt
- emacs bookmark(书签)初次使用
- Jetbrain系列编辑器设置忽略目录(node_moudles)
- fiddler设置https抓包
- 浅谈C++ STL queue 容器
- LG2996 「USACO10NOV」Visiting Cows
- Spring Boot 2.2.1 正式发布,需特别注意这个注解的使用!
- vue v-show的使用
- QAxBase: Error calling IDispatch member LineStyle: Unknown error
- 使用Vue Baidu Map对百度地图实现输入框搜索定位