看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚.

首先看看:状态寄存器(即标志寄存器)

PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,
如下所示:

15   14    13    12   11   10    9    8    7    6    5    4    3    2   1   0
                     OF   DF   IF   TF   SF  ZF      AF      PF   CF

条件码:
①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配.
②SF(Sign Flag)符号标志,结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
    有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.

控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。

为举例方便说一下jnz和jz
    测试条件
JZ   ZF=1
JNZ  ZF=0
即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)
Jnz=jump if not zero

好,接着来看test和cmp

*******************************************************************************
test属于逻辑运算指令

功能: 执行BIT与BIT之间的逻辑运算
     测试(两操作数作与运算,仅修改标志位,不回送结果).
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。TEST AX,BX 与 AND AX,BX 命令有相同效果

语法: TEST r/m,r/m/data
影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0)

运用举例:
1.Test用来测试一个位,例如寄存器:

test eax, 100b;          b后缀意为二进制
jnz  ******;             如果eax右数第三个位为1,jnz将会跳转

我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.

2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:

test ecx, ecx
jz somewhere

如果ecx为零,设置ZF零标志为1,Jz跳转

*******************************************************************************
CMP属于算术运算指令

功能: 比较两个值(寄存器,内存,直接数值)
语法: CMP r/m,r/m/data
标志位: C,P,A,Z,O

CMP比较.(两操作数作减法,仅修改标志位,不回送结果).
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
零标志很像carry,也是内部标志寄存器的一位.

例如:
Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
Jz ****;          如果设置了零标志就跳转

*******************************************************************************
我得出的结论
test逻辑与运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算结果为零,就把ZF(零标志)置1.

【转】汇编中的test和cmp指令相关推荐

  1. 汇编中的test和cmp指令[Z]

    首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示: 15   14    13 ...

  2. 贺利坚老师汇编课程56笔记:CMP指令

    指路老师的博客 CMP 操作对象1,操作对象2;计算操作对象1-操作对象2 CMP是比较指令,功能相当于减法指令,只是不保存结果 CMP指令执行后,将对标志寄存器产生影响 其他指令通过识别这些被影响的 ...

  3. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  4. 汇编中的call和ret指令

    call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址.ret指令用栈中的数据,修改偏移地址,从而实现近转移.call可以通过位移和目的地址进行转移.下面来通过汇编代码学习一下 ...

  5. win32汇编中伪指令addr和offset指令的区别

    一.相同点 1.addr 和 offset 操作符都是获得操作数的偏移地址: 2.addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中. 二.不同 ...

  6. cmp 字节 汇编_汇编 – x86 CMP指令差异

    题 以下两个x86指令之间的(非平凡)差异是什么? 39 /r CMP r/m32,r32 Compare r32 with r/m32 3B /r CMP r32,r/m32 Compare r/m ...

  7. 【汇编】汇编中的函数

    前言:本文章将讲解什么是函数,以及汇编中函数的存在形式,使用到的工具是DTDEBUG. 1.什么是函数?   在汇编中,函数就是一系列指令的合集,为了完成某个会重复使用的特定功能.         下 ...

  8. 汇编中的字符串操作指令

    每一种语言都有一些字符串操作函数,反汇编后的代码也不例外.网上讲的都比较零碎,我将它们收集起来,并配上自己的理解,形成本文. 一.字节操作指令:lodsb和stosb 1. lodsd需要寄存器esi ...

  9. 汇编中的串操作指令(MOVS,CMPS,SCAS,LODS,STOS)

           学汇编的都知道,汇编中很多问题都是对字符串进行的操作,但是我们操作时总是重复相同的操作,用多个指针进行记录,不断判断只针对位置,这样确实很麻烦,于是汇编提供了一种对字符串进行操作的指令, ...

最新文章

  1. iis布置asp.net网站——服务应用程序不可用
  2. c语言笔记:转义字符
  3. 嵌入式 c语言 面试题,嵌入式面试题-持续更新
  4. 2012 安装mysql 5.6_如何安装mysql server 5.6
  5. 直播地址公布|第八届“数学、计算机与生命科学交叉研究” 青年学者论坛--特别云论坛...
  6. ReportViewer教程(15)-矩阵报表-6
  7. html判断字段不为空,js里是否为空字符串的判断
  8. webpack资源管理
  9. C++_类和对象_对象特性_类对象做为类的成员---C++语言工作笔记046
  10. 数据分析只能当一辈子取数机?可能你缺少这个基础思维
  11. 【米课】思维导图与深度思考
  12. 百度免费开放长语音识别功能
  13. 数据抓取的艺术(二)
  14. javaScript中的变量作用域的闭包处理
  15. gxworks2使用指令手册_三菱编程软件 GX Works2 操作手册简单工程篇中文高清版
  16. Coded UI Test(二)创建一个Coded UI Test
  17. 计算机用手机的网络,台式电脑如何使用手机网络上网
  18. prevent to do sth 与 prevent sb (from) doing 用法
  19. 关于抢红包的_酷乐研究所 | 过年净抢红包了?我们准备了50种新玩法
  20. 前端工程师之华为手机如何打开开发者模式并进行手机调试查看原生APP效果。

热门文章

  1. mysql 唯一约束_Mysql 唯一性约束添加
  2. 手机页面下拉刷新效果
  3. android 关机界面修改,修改Android关机界面
  4. perl中bless的理解
  5. AWS OpenSearch 1.0 简单部署安装
  6. Linux文件系统--文件类型
  7. 保密管理专业是学计算机的吗,计算机保密管理学习学习制度.docx
  8. 写能执行cmd命令的bat文件
  9. 流媒体服务器主板型号怎么看,玩转NAS 篇五:双2.5G接口+J4125处理器,对于NAS意味着什么?威联通453Dmini对比453Bmini...
  10. 三废的日常——什么是负载均衡