资讯动态

ARM 汇编比较指令:只修改标志位的底层逻辑与实战用法

发布时间:2026/10/18 4:54:36 来源:尧图企业网站定制
前言初学 ARM 汇编时CMP、CMN、TST、TEQ 四条比较指令总会让人产生困惑指令内部完成了减法、加法、按位与、异或运算却不保存运算结果仅仅刷新 CPSR 程序状态寄存器的标志位。课堂上仅记住 “指令会影响标志位” 这一结论却不清楚这套设计的底层目的直到上机实操搭配条件跳转后才理清比较指令、标志位、条件指令三者不可分割的联动关系。本文从底层原理出发结合代码实例拆解四条比较指令的用法。一、核心底层逻辑汇编判断分为两步拆分设计高级语言中一条if语句即可完成 “数值对比 分支跳转”但 ARM 汇编将该逻辑拆分为两个独立环节分工明确比较指令负责运算留下判断依据CMP/CMN/TST/TEQ 执行内部运算后直接丢弃运算结果唯一输出是更新 CPSR 中的 N负标志、Z零标志、C进位 / 借位标志、V溢出标志。该指令不会修改任何通用寄存器也不会主动跳转程序仅把对比结果以标志位的形式保存下来。 单独书写比较指令没有任何实际效果标志位更新后无指令读取判断程序仍顺序执行对比操作等同于无效。条件指令读取标志执行分支动作所有带条件后缀的指令条件跳转 BXX、条件运算 MOVXX/ADDXX本身无法完成数值对比仅读取上一条指令刷新的标志位匹配预设条件后决定是否执行。 二者必须配对使用固定执行流程比较指令更新标志位 → 条件指令读取标志完成逻辑判断。二、四大比较指令运算原理与适用场景1. CMP 减法比较指令语法CMP Rn, operand底层运算Rn - operand完整更新 N/Z/C/V 全部标志位 核心用途判断两个数值大小区分有符号、无符号数对比是循环、区间判断最常用指令。 标志判断规则Z1两数相等C1无符号数 Rn ≥ operandN V有符号数 Rn ≥ operand。示例判断 R0 是否大于 100大于则跳转CMP R0, #100 BGT R0_Greater ; 有符号数大于跳转 BHI R0_Greater_U ; 无符号数大于跳转2. CMN 负数比较指令语法CMN Rn, operand底层运算Rn operand等价执行CMP Rn, #-operand核心用途快速判断寄存器数值是否等于某个负数无需手动取负运算。 标志判断规则Z1 时代表Rn -operand。示例判断 R0 是否等于 - 20CMN R0, #20 BEQ Equal_Neg20 ; R0 -20 跳转3. TST 位测试指令语法TST Rn, operand底层运算Rn operand仅依靠 Z 标志判断特定位状态 核心用途硬件寄存器、IO 引脚位检测快速查看某一 bit 是否置 1。 标志判断规则Z0掩码对应 bit 为 1Z1掩码对应 bit 全为 0。示例检测 R0 第 0 位是否为高电平TST R0, #0x01 BNE Bit0_Set ; bit01 跳转4. TEQ 等值测试指令语法TEQ Rn, operand底层运算Rn ^ operand仅更新 N、Z 标志不改动进位 C 核心用途单纯校验两数是否完全相等不会破坏进位标志适合连续等值判断场景。 标志判断规则Z1两数数值完全一致。示例判断 R0 与 R1 数值是否相同TEQ R0, R1 BEQ Value_Same三、实战拓展不止跳转所有指令均可加条件后缀标志位不仅服务于 B 系列跳转指令MOV、ADD、SUB 等常规运算指令都支持条件后缀可省去多余分支精简代码。 需求R0 大于 50 时将 R1 赋值为 100CMP R0, #50 MOVGT R1, #100 ; 满足GT有符号大于才执行赋值四、总结比较指令 “只改标志位、不存结果” 是硬件分层设计分离 “对比运算” 和 “逻辑判断”简化 CPU 指令架构四条指令各司其职CMP 判大小、CMN 判负数、TST 测比特、TEQ 判等值标志位是连接比较指令与条件指令的桥梁二者必须搭配使用单独书写比较指令无业务逻辑意义条件后缀适用于全部 ARM 基础指令灵活运用可简化分支代码提升汇编执行效率。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑