- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章-比较和条件跳转
通常情况下,比较指令有两个操作数,并
根据比较的结果来决定程序是否跳转到后
面的分支中。
我们知道,当注册程序要求我们输入序列
号的时候,这个时候,程序会执行一条或
者多条比较指令,根据比较的结果来判断
你输入的序列号是否正确。
接下来,我们将详细介绍比较和跳转指令
。
我们知道,某些指令的指令会影响到标志
位,最常见的就是零标志位Z。
CMP
该指令是比较两个操作数,实际上,它相
当于SUB指令,但是相减的结构并不保存
到第一个操作数中。只是根据相减的结果
来改变零标志位的,当两个操作数相等的
时候,零标志位置1。
看看下面的例子:
CMP EAX, ECX
EAX与ECX相减,它们本身的值并不改变,
只是根据它们相减的结果来决定零标志位
Z是否置1。在OD中来看一个例子。
写入CMP EAX,ECX指令并修改EAX和ECX的
值,让它们相等。
按下F7键,可以看到EAX和ECX的值并没有
改变,但是相减的结果是零标志位Z被置
为了1,我们在OD来看一个例子。
实际上,我们并不关心相减的确切结果,
我们只关心EAX和ECX是否相等。
虽然我们还没有介绍条件跳转,这里简单
提一下,有两种可能性:根据标志的值来
决定跳转还是不跳转。最简单的例子就是
配合JZ指令,如果Z标志被置为1,就跳转
,否则,就不跳转。
如果有两个序列号做比较,例如EAX存放
的是你输入的序列号,ECX存放的是正确
的序列号,该程序使用CMP指令来比较,
如果它们两个是相等的,那么零标志位Z
就置为1,后面JZ指令就会跳转到注册成
功的部分。如果EAX不等于ECX的话,那么
零标志位就会置0,那么就不会跳转到注
册成功的部分。
让我们来看看有关条件跳转的一个更具体
的例子。
符号标志位S是比较第一个操作数是否大
于第二个操作数。
让我们来看下面的例子:
重新写入CMP EAX,ECX指令,但是现在要
求是EAX的值要大于ECX的值。
按下F7键:
可以看到,零标志位Z是0,所以我们知道
,这两个值并不相等,并且符号标志位S
也等于0,我们就可以得知EAX-ECX结果是
正的。也就说明EAX大于ECX。
依然是CMP EAX,ECX指令,但这次是EAX小
于ECX。
然后按下F7键:
这里我们可以看到,EAX减去ECX的结果是
负的,也就是说ECX大于EAX。所以符号标
志位S被置为了1。
根据比较的不同结果来设置相应的标志位
,来决定程序应该走哪个分支。此外,CM
P指令还允许寄存器与BYTE,
WORD,DWORD类型的内存单元的值做比较。
这里,该指令是比较的EAX和405000内存
单元的值,跟之前一样,我们在OD来看看
解释窗口。
这个例子里面,EAX是小于405000内存单
元中的值的,405000内存单元中的值是10
00,相减的结果为负的,所以符号标志位
S会被置1。
类似的例子还有
CMP AX,WORD PTR DS:[405000]
和
CMP AL,BYTE PTR DS:[405000]
这两种情况下分别是与BYTE,WORD类型的
内存单元的值做比较。
TEST (逻辑比较)
该指令在一定程序上和CMP指令时类似的
,两个数值进行与操作,结果不保存,但
是会改变相应标志位 (比如说,SF,ZF,PF
标志位),程序可以根据结果来决定是否
跳转到相应的分支。
下面有几个例子:
TEST EAX,EAX
你会说,如果EAX与自己做比较呢?用这
个指令,可以确定EAX是否等于0。
我们在OD中写入下面的指令:
TEST EAX,EAX
与操作的表如下:
1 and 1 1
1 and 0 0
0 and 1 0
0 and 0 0
上表中结果为0的只有一种情况,只有当
两个数都为0的情况 (我们并不关心操作数
的值是多少,因为我们是EAX与自身操作
,它们永远是相等的),但是如果EAX的二
进制某些位为1的话,那么运算的结果就
不为零。
我们将EAX修改为0。
OD中在寄存器上单击鼠标右键选择零。
现在按下F7键。
我们看到,零标志位被置1了,两个0做与
操作,结果为0,所以零标志位被置1。
如果我们将EAX改为非零值,然后重复上
面的操作呢。
按下F7键。
零标志位没有被置1的话,就说明结果不
等于0。
如果你使用计算器的话,可以计算出390
AND 390结果依然是390,二进制为111001
0000。
因为位与运算中,如果两个操
您可能关注的文档
- 糖尿病教育-01-糖尿病基础知识.pptx
- 糖尿病教育-02-从关键指标看糖尿病的诊断与治疗.pptx
- 糖尿病教育-05-糖尿病降糖药物的选择.ppt
- 糖尿病教育-08-HbA1c测试介绍.pptx
- 糖尿病教育-09-糖尿病与并发症.pptx
- 糖尿病教育-11-关注下肢血管病变和糖尿病足.pptx
- 糖尿病教育-12-β细胞功能知多少.pptx
- 糖尿病教育-16-体重控制.pptx
- 糖尿病教育-17-肥胖糖尿病患者的治疗与管理.pptx
- 人工神经元网络模型.pptx
- 使用OllyDbg从零开始Cracking-07第七章-call ret.pdf
- 使用OllyDbg从零开始Cracking-08第八章-循环 字符串指令和寻址方式.pdf
- 使用OllyDbg从零开始Cracking-09第九章-基本概念.pdf
- 使用OllyDbg从零开始Cracking-10第十章-断点.pdf
- 使用OllyDbg从零开始Cracking-11第十一章_硬件断点与条件断点.pdf
- 使用OllyDbg从零开始Cracking-12第十二章-消息断点.pdf
- 使用OllyDbg从零开始Cracking-13第十三章-硬编码序列号寻踪-Part1.pdf
- 使用OllyDbg从零开始Cracking-14第十四章-硬编码序列号寻踪-Part2.pdf
- 使用OllyDbg从零开始Cracking-15第十五章-硬编码序列号寻踪-Part3.pdf
- 使用OllyDbg从零开始Cracking-16第十六章-序列号生成算法分析-Part1.pdf
原创力文档


文档评论(0)