比较指令

  • CMP, CMN,TEQ, TST这几条指令,总是会更新条件标志位,但运算结果总是被扔掉,不会进行保存。

他们的语法格式如下

CMP{cond} Rn, Operand2;Rn - Operand2 操作类似SUBS(除了扔掉运算结果)
CMN{cond} Rn, Operand2;Rn + Operand2 操作类似ADDS(除了扔掉运算结果)
TEQ{cond} Rn, Operand2;Rn EOR Operand2  操作类似EORS(除了扔掉运算结果)
TST{cond} Rn, Operand2;Rn AND Operand2  操作类似ANDS(除了扔掉运算结果)

tst:逻辑处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的     值。当前运算结果为1,则Z=0;当前运算结果为0,则Z=1
cmp:算数处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行减法比较,不存储结果,可能都会更改BZCV标志位。Z位是最好理解的,只有运算的结果所有的位都为0则,Z置位。

CMN R1,R0     ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位。只有运算的结果所有的位都为0则,Z置位。

TEQ     R1,R2       ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

bne: 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处
beq: 数据跳转指令,标志寄存器中Z标志位等于零时, 跳转到BEQ后标签处

beq:“beq run_on_dram” 如果 r0 - r1 = 0 ,程序跳转到run_on_dram处,再向下执行,此时CPSR的Z标识位为1,我们可以理解为:cmp的结果为0,或者CPSR的Z标识位为1时,程序跳转到beq 后的标签处;bne:“bne clear_loop”  如果 r0 - r1  != 0 ,程序跳转到clear_loop处,再向下执行,此时CPSR的Z标识位为0,我们可以理解为:cmp的结果为1,或者CPSR的Z标识位为0时,程序跳转到bne 后的标签处;备注:对TEQ和TST来说不会影响到V标志,N位和Z位会根据操作结果会被更新,Operand2移位操作也可能会影响到C位。而CMP和CMN则根据运算结果都有可能会被影响到。

下面我们来说说,什么情况下这四个位会被置位/清除

条件标志 置位/清除
N 当运算的结果为负数的话置位,其他情况清0
Z 当运算的结果为0的话置位,其他情况清0
C 当运算的结果产生进位或者减法运算没有借位的话置位,其他情况清0
V 当运算的结果产生溢出的话置位,其他情况清0

---------------------------上诉部分转自:https://www.jianshu.com/p/0c6192da2fd0------------------

所有ARM数据处理指令的乘法指令均可选择使用S后缀,并影响状态标志位。而其它指令一般不允许加S后缀,如B 、LDR、SWI、MRS等。


N   运算结果的最高位反映在该标志位。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;
      例如:执行movs r0,#0x7FFFFFFF后N=0;因为R0最高位为0
                  执行movs r0,#0x80000000后N=1;因为R0最高位为1
                  执行CMP r0,r0后N=0;因为R0-R0=0x00000000;
                  故N一般看目标寄存器的最高位,即N = Rd[31]。

Z   指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;
      例如:执行CMP r0,r0后Z=1
                  执行MOVS R0,#0后Z=1
                  故Z一般看目标寄存器的值是否为0,Rd=0时Z=1,否则Z=0。
      
C   当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。当进行减法运算(包括CMP 指令),
      并且最高位产生借位时C=0,否则C=1。对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值,
      其它指令C通常不变; 
      例如:执行 mov  r0,#0xF0000000
                           ADDS  R0,R0,R0
                                 后C=1;
                  执行   SUBS  R2,R2,R2后C=1,因为R2-R2=0不需要借位。
                  执行   CMP R3,R3后C=1;
                  执行   MOV R1,0x80000000
                             movs r0,r1 ,lsr #32
                               后C=1;
                  执行   mov r0,#0x10    
                             mov r1,#0x7FFFFFFF
                             subs r3,R0,r1 ,lsr #1
                                  后C=0;
                   总之,一般情况下加法进位,减法无借位时C=1; 对于结合移位操作的非加/减法指令,C为最后移出的值。
              
V    当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。
      例如:执行        mov r1,#0x80000000
                                  adds r1,r1,r1            后V=1;
                 执行                mov r1,#0x70000000
                                         adds r1,r1,r1 或 CMN R1,R1     后V=1;
                  执行                 LDR  R0,=0x8000000
                                            LDR  R1,=0x7FFFFFFF
                                           CMP R0,R1   后V=1     ;
                  总之,两个负数运算结果第31位为0,则V=1
                              两个正数运算结果第31位为1,则V=1。

另外THUMB指令一般不需要S后缀,便能影响状态标志位。
如 在THUMB状态下下面两条指令相同              
                    movs r0,#0x00
                    mov r0,#0x00

MOV一般不影响CPSR, 除非执行类似MOV pc, lr,效果上等同于BX lr
      MOVS总是会影响CPSR, 包括N,Z,C标志位
        执行MOV pc, lr,可能会影响到T标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态)

在Thumb代码里不能使用B跳转到ARM代码,因为T标志不会切换,即使跳到ARM代码,
        也会按照Thumb方式来执行,BX是跳特殊指令,会根据目标寄存器地址来切换T标志。

转自 :http://www.eeworld.com.cn/mcu/article_2016051126281.html

--------------------------------------------------------------

之前以为CMP指令执行后,不管是进位还是借位,C标志位都会置位,其实这是错的,所以我整理了一下四个ARM标志位的置位和清零的规则:

N  当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零.
Z  Z=1表示运算的结果为零,Z=0表示运算的结果非零。
C  可以有4种方法设置C的值:
   加法运算(包括CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
   减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。
   对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
   对于其它的非加/减运算指令,C的值通常不会改变。
V  可以有2种方法设置V的值:
   对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
   对于其它的非加/减运算指令,V的值通常不会改变。
    
0000 = EQ - Z set (equal,相等)
0001 = NE - Z clear (not equal,不相等)
0010 = CS - C set (unsigned higher or same,无符号大于或等于)
0011 = CC - C clear (unsigned lower,无符号小于)
0100 = MI - N set (negative,负数)
0101 = PL - N clear (positive or zero,正数或零)
0110 = VS - V set (overflow,溢出)
0111 = VC - V clear (no overflow,未溢出)
1000 = HI - C set and Z clear (unsigned higher,无符号大于)
1001 = LS - C clear or Z set (unsigned lower or same,无符号小于或等于)
1010 = GE - N set and V set, or N clear and V clear (greater or equal,带符号大于或等于)
1011 = LT - N set and V clear, or N clear and V set (less than,带符号小于)
1100 = GT - Z clear, and either N set and V set, or N clear and V clear (greater than,带符号大于)
1101 = LE - Z set, or N set and V clear, or N clear and V set (less than or equal,带符号小于或等于)
1110 = AL - always
1111 = NV - never
--------------------- 
转自:https://blog.csdn.net/nanfangqiulin/article/details/51122718

ARM关于标志位影响详解相关推荐

  1. CTF PWN基础知识(寄存器、栈、汇编指令、标志位)详解

    本文中寄存器缩写都有标注上中文含义,方便初学者理解记忆. 寄存器: 寄存器是计算机暂存指令.数据和地址的地方. 常用寄存器及其功能整理: RIP:程序计数寄存器,来存放下一条即将用来执行的指令的地址, ...

  2. Ollydbg中C标志位P标志位A标志位Z标志位以及S,T,D,0标志位含义详解

    转载自https://www.cnblogs.com/whzym111/p/6374855.html 知识点: l 标志位 置位相关指令   l 标志寄存器PSW 标志寄存器PSW(程序状态字寄存器P ...

  3. ZIP(32位)文件格式详解

    ZIP(32位)文件格式详解 为什么要去了解ZIP文件格式 最近有个需求,需要加载jar包中的jar包中的class,此时有两种方式: 1.将jar解压缩,然后将解压缩后的路径添加到class pat ...

  4. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  5. 位运算详解+竞赛常见用法总结

    目录 一.位运算详解 二.位运算应用 1.快速幂 2.给定一个数组A, 长度为n,求下面这段程序的值 3.数数字 4.数数字 2 5.nim博弈问题: 6.树状数组 7.判断一个数x是不是2的某次方 ...

  6. Linux_arm_启动_c语言部分详解,[原创]Linux arm 启动 c语言部分详解第四讲

    Linux arm启动c语言部分详解第四讲(from setup_per_cpu_areas();) Written by leeming 上面的setup_arch花了我们大量的篇幅,现在我们要继续 ...

  7. php的位运算,php的位运算详解

    php的运算符有一类是位运算的,本文主要和大家分享php的位运算详解,希望能帮助到大家. 一:& And按位与 $a&$b 将把二进制$a和二进制$b位数都为1的设为1,其他位为0 例 ...

  8. 一篇搞定位运算——java位运算详解

    java位运算详解 前言 一.位运算符 &:按位与 |:按位或 ~:按位非 ^:按位异或 <<:左位移运算符 >>:右位移运算符 <<<:无符号右移运 ...

  9. Java 位运算符详解

    文章目录 Java 位运算符详解 前情提要: 一.简介 二.如何区分 &,|,^ 是逻辑运算符还是位运算符? 三.例子 按位与 & 按位或 | 按位异或 ^ 按位取反 ~ 左移 < ...

最新文章

  1. Microbiome:地球上有多大比例的原核生物已经被测序了基因组?
  2. 【Oracle】表空间相关集合
  3. 2017-2018网络攻防第二周
  4. java runtime shell_java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现...
  5. java web开发技术大_2021年六大javaweb开发主流技术
  6. [你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理
  7. Android手机mm开头的大文件,[2018年最新整理]2Android源代码编译命令m和mm和mmm以及make分析.doc...
  8. 厉害了!《流浪地球》《疯狂的外星人》票房均破10亿元大关
  9. 关联Left Outer Join的第一条记录
  10. 编程基本功:再紧急的工作到了员工手里,都不急
  11. python中string函数的用法_python中string模块各属性以及函数的用法
  12. jsp购物车和mysql_用jsp和数据库做的购物车的源程序
  13. 【java初学】正则表达式和敏感词汇过滤
  14. qq里面发送图片显示服务器被拒绝,如何解决qq无法发送图片的问题
  15. 手机卸载不了刷机精灵
  16. colab读取Google Drive
  17. 遥感影像镶嵌及实现(四)
  18. FFMPEG之音频播放
  19. 微信文章排版技巧和相关排版工具
  20. Day 29 - AWS Lambda 接收参数查询 Dynamodb

热门文章

  1. WeTest 五周年 | “领航者” 的破浪之路:诞生
  2. upgrade和update的区别
  3. 华为matebook13笔记本 右侧type-c接口 没反应,失灵 ,失效,不通电,无法识别usb设备,设备管理器Unknown usb device
  4. codefile codebehind
  5. java 0xff00_ 0xFF 与  0xFF00 的作用
  6. Tinker -- 微信Android热补丁方案 接入指南
  7. 烟台移动dns网关_移动宽带如何设置网关和DNS服务器地址?
  8. linux下stray ‘\342’ in program等错误处理方法
  9. win10连接共享打印机_连接不了局域网共享打印机
  10. 最好的云主机评测和比较