ARM 汇编指令:(五)CMP指令

这篇具有很好参考价值的文章主要介绍了ARM 汇编指令:(五)CMP指令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.CMP比较指令

2.指令条件码 cond


1.CMP比较指令

CMP指令是计算机指令集中的一种比较指令,用于比较两个操作数的大小关系或相等性,并根据比较结果设置或更新条件码寄存器(或程序状态字)的标志位。

指令格式:CMP  <第一操作寄存器>  <第二操作数>

  • 第一操作寄存器:参与比较的第一个数(只能是寄存器)
  • 第二操作数:参与比较的第二个数(既可以是寄存器,也可以是立即数)

执行CMP指令时,计算机会计算操作数1与操作数2之间的差值,并更新CPSR状态寄存中的标志位。常见的标志位包括零标志位(Z),负标志位(N),进位标志位(C)和溢出标志位(V)。

ps:这里提一下CPSR状态寄存器每一位的作用。

cmp指令,arm架构 汇编,arm开发,汇编

 示例分析:

cmp r1, r2;
bleq r1;  //r1 和 r2保存的地址一样,才发生跳转

用C表示就是:
if (r1 == r2) {
    r1();
}

如果R1 == R2,即 R1 - R2 = 0,CPSR中的状态位 Z = 1

如果R1 != R2,即 R1 - R2 != 0,CPSR中的状态位 Z = 0

如果R1 < R2,即 R1 - R2 运算过程中产生了借位,CPSR中的状态位 C = 0

如果R1 <= R2,即 R1 - R2 运算过程中产生了借位 或者 R1 - R2 = 0,此时 C = 0 或 Z = 1

如果R1 > R2,即 R1 - R2 运算过程中没有产生借位,而且 R1 - R2 != 0,此时 C = 1 且 Z = 0

如果R1 >= R2,即 R1 - R2 运算过程中没有产生借位 或者 R1 - R2 = 0,则 C = 1

所以看到这里,大家应该知道cmp指令的实质,其实就是两个数subs(有符号的减法),后续的指令(比如:BlEQ,其实他就是跳转指令B ,只是在执行前需要根据CPSR状态,判断是否执行跳转BL指令)根据CPSR的N Z C V状态做出不同的条件判断动作。

2.指令条件码 cond

什么是指令条件码? 拿第一节讲过的mov举例:

MOV{cond}{S} Rd, Operand2 

那个cond就是指令条件码,它是可选的。mov+cond ,就说明这条指令在执行前,需要根据当前的CPSR状态寄存器的状态(cmp作比较的时候,修改了CPSR的状态),来判断是否执行mov。

类似的:

BEQ 实际上B  判断EQ的条件是否成立才执行.

addne 表示ADD 判断NE的条件是否成立 才开始加.

示例:

cmp r1, r2;
movne r1,r2;  //r1 和 r2保存的值不一样,才发生mov操作

用C表示就是:
if (r1 != r2) {
    r1 = r2;
}

看到这里相信大家已经能够明白条件码的作用了,那么接下来我们了解下有哪些条件码:

ARM机器码中,高4bit是条件执行码,ARM指令是否执行取决这4bit数据

cmp指令,arm架构 汇编,arm开发,汇编

这张表主要理解每个字母的单词意思,否则真不好记,只能用到的时候查表,哈哈!! 

下一页:ARM 汇编指令:(六) B 跳转指令文章来源地址https://www.toymoban.com/news/detail-850085.html

到了这里,关于ARM 汇编指令:(五)CMP指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】

    上篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 下篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) ARMv8 在硬件层名引入了一个新的 zero 寄存器 : XZR (64-bits), WZR (32-bits)。比如要将某一变量赋值为0x0, 由于ARM不允许直接操作内存单元上的数据

    2024年02月15日
    浏览(43)
  • 【ARM系列】ARM常用汇编指令

    在调试芯片启动代码或者分析ARM core运行流程的过程中,尝尝需要对照软件代码的反汇编文件进行分析,因此有必要掌握一些常用的arm汇编指令。 指令格式:MOV{条件}{S} 目的寄存器,源操作数 指令含义:将源操作数赋值给目的寄存器。源操作数可以是寄存器,立即数或带移位

    2024年02月04日
    浏览(26)
  • ARM汇编 : 汇编指令,伪指令,汇编程序格式

    计算机的指令集一般可分为4种: 复杂指令集(CISC) 精简指令集(RISC) 显式并行指令集(EPIC) 超长指令字指令集(VLIW) ARM指令集属于RISC,RISC相对于CISC指令集,主要有以下特点: ●Load/Store架构,CPU不能直接处理内存中的数据,要先将内存中的数据Load(加载)到寄存器中

    2024年02月12日
    浏览(23)
  • 【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】

    上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的学习 下篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过 标签(label) 和 子程序调用指令 (如BL,BLX) 来实现类似于函数的功能。 例如

    2024年02月14日
    浏览(35)
  • 【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 下篇文章:ARM64 常见汇编指令学习 15 – ARM 标志位的学习 .balignl 是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。. balignl 是 .balign 的变体。 .balignl 完整

    2024年02月14日
    浏览(31)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(32)
  • ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

    下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL 在 ARM 汇编中,“ .macro ” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调

    2024年02月14日
    浏览(28)
  • ARM 汇编比较指令-条件执行指令

    比较指令用来比较两个数大小,或者是否相等,比较指令的运算结果会影响CPSR寄存器的NZC、V标识位,具体的标志位可以参考前面的CPSR寄存器介绍,比较指令的格式如下/ CMP {cond} Rn, operand2 比较两个数大小 CMN {cond}Rn, operand2 取负比较  比较指令的使用示例及说明如下。

    2024年02月03日
    浏览(37)
  • ARM-汇编指令

    链接脚本文件 作用:给编译器进行使用,告诉编译器各个段,如何进行分布 1.汇编指令:编译器将一条编译指令编译生成机器码,占用代码段空间 2.伪指令:伪指令本身不是一条指令,编译器可以将器编译生成多条指令,共同完成一条指令功能 3.伪操作:指导编译器对代码如

    2024年02月11日
    浏览(34)
  • ARM(汇编指令)

     

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包