汇编指令-状态寄存器、cmp、test、jz等指令详细说明

 更新时间:2020年01月20日 15:17:15   转载 作者:xingpacer  
这篇文章主要介绍了汇编指令-状态寄存器、cmp、test、jz等指令详细说明,需要的朋友可以参考下

一、状态寄存器

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

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

条件码:

①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)陷井标志。

test和cmp指令运行后都会设置标志位,为举例方便说一下jnz和jz

测试条件

JZ   ZF=1
JNZ  ZF=0
即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)
Jnz=jump if not zero

二、test指令和cmp指令

好,接着来看test和cmp

1、test指令

test属于逻辑运算指令

功能:执行BIT与BIT之间的逻辑运算
测试(两操作数作与运算,仅修改标志位,不回送结果)。

Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST 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跳转的条件非0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。

2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
test ecx, ecx
jz somewhere
如果ecx为零,设置ZF零标志为1,Jz跳转

2、cmp指令
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。

对于jz和jnz,查看代码和理解汇编代码时,直接判断test和cmp的运算结果决定是否跳转,至于ZF标记位是系统得知运算结果的标记位。

三、 直接标志转移

指令格式                 机器码                    测试条件                       如...则转移  
JC                           72                           C=1                               有进位
JNC                         73                          C=0                               无进位
JZ/JE                       74                          Z=1                                零/  
JNZ/JNE                  75                         Z=0                               不为零/  
JS                           78                           S=1                                负号
JNS                         79                          S=0                                正号
JO                           70                          O=1                               有溢出
JNO                         71                         O=0                               无溢出
JP/JPE                     7A                        P=1                               奇偶位为偶
JNP/IPO                   7B                        P=0                               奇偶位为奇

四、间接标志转移

先用cmp指令比较再用下面的判断(少了一个 JE 为等于):
指令格式          机器码             测试格式                如...则转移
JA/JNBE()        77                    CZ=0                      >/  
JAE/JNB()        73                    C=0                        >=/  
JB/JNAE()        72                    C=1                        </  
JBE/JNA()        76                    CZ=1                      <=/  
JG/JNLE()        7F                   (SO)Z=0                  >/  
JGE/JNL()        7D                   SO=0                      >=/  
JL/JNGE()        7C                   SO=1                      </  
JLE/JNG()        7E                   (SO)Z=1                  <=/

小结

test指令
将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。

影响的标志位CF,ZF,OF,SF,PF

cmp指令
比较指令。cmp的功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

影响的标志位CF,ZF,OF,AF,PF

相关文章

  • 汇编语言中的函数调用参数传递及全局与局部变量与“基址”

    汇编语言中的函数调用参数传递及全局与局部变量与“基址”

    这篇文章主要介绍了汇编眼中的函数调用参数传递以及全局与局部变量与“基址”,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 使用汇编语言编写一条简单的贪吃蛇的实现

    使用汇编语言编写一条简单的贪吃蛇的实现

    这篇文章主要介绍了使用汇编语言编写一条简单的贪吃蛇的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 汇编语言指令集之串处理指令讲解

    汇编语言指令集之串处理指令讲解

    这篇文章主要介绍了汇编语言指令集之串处理指令讲解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-01-01
  • C 表达式中的汇编指令

    C 表达式中的汇编指令

    这篇文章主要介绍了C 表达式中的汇编指令,需要的朋友可以参考下
    2020-01-01
  • 8086汇编语言nasm版本

    8086汇编语言nasm版本

    这篇文章主要介绍了8086汇编语言nasm版本,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 汇编语言中的各种寄存器介绍

    汇编语言中的各种寄存器介绍

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言.这篇文章主要介绍了汇编语言中的各种寄存器介绍,需要的朋友可以参考下
    2020-01-01
  • 汇编用串检测scasb寻找数的位置实现

    汇编用串检测scasb寻找数的位置实现

    这篇文章主要介绍了汇编用串检测scasb寻找数的位置实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 汇编语言之寄存器详解

    汇编语言之寄存器详解

    这篇文章主要介绍了汇编语言之寄存器详解,需要的朋友可以参考下
    2020-01-01
  • 使用汇编实现字符串的大小写转换

    使用汇编实现字符串的大小写转换

    这篇文章主要介绍了使用汇编实现字符串的大小写转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 汇编实现的memcpy和memset的方法

    汇编实现的memcpy和memset的方法

    这篇文章主要介绍了汇编实现的memcpy和memset的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论