汇编- 比较和条件跳转

通常情况下,比较指令有两个操作数,并根据比较的结果来决定程序是否跳转到后面的分支中。

我们知道,当注册程序要求我们输入序列号的时候,这个时候,程序会执行一条或者多条比较指令,根据比较的结果来判断你输入的序列号是否正确。

接下来,我们将详细介绍比较和跳转指令。

我们知道,某些指令的指令会影响到标志位,最常见的就是零标志位Z。

1, CMP

该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。

看看下面的例子:

CMP EAX, ECX

EAX与ECX相减,它们本身的值并不改变,只是根据它们相减的结果来决定零标志位Z是否置1。

实际上,我们并不关心相减的确切结果,我们只关心EAX和ECX是否相等。

虽然我们还没有介绍条件跳转,这里简单提一下,有两种可能性:根据标志的值来决定跳转还是不跳转。最简单的例子就是配合JZ指令,如果Z标志被置为1,就跳转,否则,就不跳转。

如果有两个序列号做比较,例如EAX存放的是你输入的序列号,ECX存放的是正确的序列号,该程序使用CMP指令来比较,如果它们两个是相等的,那么零标志位Z就置为1,后面JZ指令就会跳转到注册成功的部分。如果EAX不等于ECX的话,那么零标志位就会置0,那么就不会跳转到注册成功的部分

让我们来看看有关条件跳转的一个更具体的例子。

符号标志位S是比较第一个操作数是否大于第二个操作数。

让我们来看下面的例子:

重新写入  CMP  EAX,ECX  指令,但是现在要求是EAX的值要大于ECX的值。

可以看到,零标志位Z是0,所以我们知道,这两个值并不相等,并且符号标志位S也等于0,我们就可以得知EAX-ECX结果是正的。也就说明EAX大于ECX。

依然是CMP EAX,ECX指令,但这次是EAX小于ECX。这里我们可以看到,EAX减去ECX的结果是负的,也就是说ECX大于EAX。所以符号标志位S被置为了1。

根据比较的不同结果来设置相应的标志位,来决定程序应该走哪个分支。此外,CMP指令还允许寄存器与BYTE,WORD,DWORD类型的内存单元的值做比较。

CMP EAX, DWORD PTR DS:[0x40500]  这里,该指令是比较的EAX和405000内存单元的值

类似的例子还有

CMP AX,WORD PTR DS:[405000] 和   CMP AL,BYTE PTR DS:[405000]    这两种情况下分别是与BYTE,WORD类型的内存单元的值做比较。

2, 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的话,那么运算的结果就不为零。

3, JUMPS

所有的跳转指令都会指向程序将会跳转到的地址。我们在下面的列表中可以看到各种不同类型的跳转指令。

4, JMP –跳转

5, JE, JZ –结果为零则跳转, 这两个条件跳转指令是等价的,零标志位Z被置1则跳转

6, JNE, JNZ –结果不为零则跳转

7, JS –结果为负则跳转

8, JNS –结果不为负则跳转

9, JP, JPE –结果中1的个数为偶数则跳转

10, JNP, JNPE –结果为1的个数为奇数则跳转

11, JO –结果溢出了则跳转

12, JNO –结果没有溢出则跳转

13, JB, JNAE –小于则跳转 (无符号数)

14, JNB, JAE –大于等于则跳转 (无符号数)

15, JBE, JNA –小于等于则跳转 (无符号数)

16, JNBE, JA –大于则跳转(无符号数)

17, JL, JNGE –  小于则跳转(有符号数)

18, JNL, JGE –大于等于则跳转 (有符号数)

19, JLE, JNG –小于等于则跳转 (有符号数)

20, JNLE, JG –大于则跳转(有符号数)

21, JMP 这是一个无条件跳转指令,即总是跳转到指定的地址。

可以看到,这些条件跳转指令被分为了两类:那些我们需要考虑符号的,那些不需要考虑符号的。

JA,JB,JBE,JAE的两个操作数都是正数(无符号数),而JG,JL,JLE,JGE把两个操作数都看成有符号数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容

  • 1.地址总线,数据总线,控制总线在哪里,它们有什么作用?答:它们都是cpu连接外部组件的线路。地址总线:地址总线A...
    MagicalGuy阅读 1,450评论 0 1
  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 7,993评论 1 10
  • 反汇编窗口: 作用:ollydbg在这里显示反汇编代码 在此可以进行调试 这里可以进行关闭分析 寄存器窗口: 堆栈...
    逆天的怪兽阅读 2,024评论 0 1
  • asm();括号里面每条指令后不加上\n\t会怎么样例如下面的代码exam_x86.c 内核完全注释上说是为了预处...
    sgy1993阅读 4,501评论 0 3
  • 算术和逻辑指令ADC : 带进位的加法(Addition with Carry)ADC{条件}{S} <dest...
    luffier阅读 3,756评论 0 3