一、状态寄存器

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

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

汇编语言的C状态寄存器,汇编指令-状态寄存器、cmp、test、jz等指令详细说明相关推荐

  1. 汇编指令 - 状态寄存器、cmp、test、jz等指令

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

  2. 汇编指令:MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用

    1.MSR和MRS指令介绍 MRS 指令: 对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有S ...

  3. 汇编语言:mov指令,寄存器,寻址

    冯诺依曼计算机,将计算机分为5大部件:运算器,控制器,存储器,输入设备,输出设备.运算器和控制器共同执行指令.指令和数据一样,保存为二进制数据.运算器和控制器共同组成CPU,CPU执行机器指令,也就是 ...

  4. 一些汇编指令和寄存器。

    今天学习C中对于一些代码中,执行原理不是清楚的了解,如简单的字符型char数据,编译器是如何处理的.以及等等很多只看过程远远不能清楚了解内部原理,对于学习有很深的障碍.所有有必要去学习基础汇编与寄存器 ...

  5. 【整理】X86常用的汇编指令及寄存器

    X86常用的汇编指令及寄存器 这几天需要用到反编译的工具,发现好多年不用的汇编快忘光了,赶紧整理一下. 一.寄存器 在X86指令集中寄存器分为四类:通用寄存器.指令指针寄存器.段寄存器.标志寄存器. ...

  6. Intel汇编-FPU状态

    # An example get the FPU status register contents # # FPU寄存器包括8个80位数据寄存器. # # 因FPU独立于主处理器,一般不使用EFLAG ...

  7. 【汇编语言】通用寄存器和基础汇编指令

    文章目录 前言 1. 通用寄存器 2. 字在寄存器中的存储 2.1 两个单位 2.2 基础的汇编指令 2.2.1 MOV指令 2.2.2 ADD指令 2.2.3 传送运算规范 3. 相关练习题 前言 ...

  8. 初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容

    为什么80%的码农都做不了架构师?>>>    //XCHG 指令: 交换寄存器的内容 varx,y: Integer; beginx := 1; y := 9;asmmov eax ...

  9. X86汇编常见的寄存器

    X86汇编常见的寄存器 4个数据寄存器(EAX.EBX.ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和GS) ...

最新文章

  1. WebBrowser页面与WinForm交互技巧
  2. yunyang1994 tensorflow_yolov3 对于检测中心点的边缘物体时评估IOU对召回率和精度的影响
  3. python的列表和元组
  4. ?Web开发者需要知道的CSS Tricks
  5. 2019年python黑马_决心在2019年让Python成为您的朋友
  6. 【重点 递归 动态规划 正则表达式匹配】LeetCode 10. Regular Expression Matching
  7. 大数运算之C 语言大数演算法
  8. 植物大战僵尸的简单修改
  9. netty权威指南目录
  10. 安卓获取不到imsi_Android10.0 SDK29版本拿不到手机的IMSI解决办法
  11. 批发行业的各种提成方式
  12. 构造方法以及构造方法的重载
  13. 【Pygame实战】嗷大喵历险记之程序员吸猫指南:真的太上头了~
  14. symbian os:描述符
  15. 爱立信语言交换机eMG800ucp使用方法
  16. 阿里云轻量应用服务器如何快速搭建WordPress个人博客?
  17. Android中国象棋自绘简单实现
  18. 三毛转本计算机百度云,2017年转本计算机英文缩略词对照(三毛老师编写).pdf...
  19. 郭光灿院士--奇妙的量子世界笔记1(量子世界和经典世界区联系)
  20. 【Java 代码实例 10】Google核心库GUAVA

热门文章

  1. Gate使用手册(四)数据输出
  2. 记:从零开始讲解UDS(一)——协议概述
  3. Ubuntu 18.04.2 LTS更换国内快速更新源的正确姿势
  4. python做兼职_“隐形贫困者”自学Python做副业,教你如何月入10000+
  5. 摩尔斯电码、摩斯电码
  6. 在计算机系统中 接口是什么意思,计算机中操作系统是什么的接口
  7. 视觉设计人员必备-网址篇(持续完善中)
  8. 一张照片,AI生成抽象画(CLIPasso项目安装使用) | 机器学习
  9. 搞大事! EABM社区和众多大牌经纪商强强联手合作
  10. 【iOS开发--Swift语法】gard 的具体使用