ARM 汇编指令:TST

ARM 汇编指令:TST

本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~
1、汇编指令在不同架构中的联系与区别
2、ARM 汇编指令:MOV
3、ARM 汇编指令:LDR
4、ARM 汇编指令:STR
5、ARM 汇编指令:MRS 和 MSR
6、ARM 汇编指令:ORRS
7、ARM 汇编指令:BEQ
8、ARM 汇编指令:TST

TSTTest 的缩写。是ARM 汇编中的一条测试指令 ,用于测试特定的位是否被设置,但不保存结果

功能

  • 对两个操作数执行按位与操作
  • 不保存结果(只更新条件标志)
  • 根据按位与的结果设置 CPSR 中的标志位(N、Z)

语法

armasm 复制代码
TST{cond} Rn, Operand2
  • Rn:第一个操作数寄存器
  • Operand2:第二个操作数(可以是立即数或寄存器,可带移位)

工作原理

复制代码
TST Rn, Operand2
执行: Rn & Operand2
更新标志位,但不保存结果到寄存器

标志位更新

  • N 位:结果的第31位值(1为负,0为正)
  • Z 位:结果为0时置1,否则清零
  • C 位:不受影响(除非包含移位操作)
  • V 位:不受影响

常见用途

armasm 复制代码
; 示例1:检查寄存器是否为零
TST R0, R0      ; R0 == 0?
BEQ zero_case   ; Z=1 时跳转

; 示例2:检查特定位是否置1
TST R1, #0x08   ; 检查第3位
BNE bit_set     ; 第3位为1时跳转

; 示例3:检查寄存器是否为2的幂
SUB R2, R0, #1
TST R0, R2      ; (R0 & (R0-1))
BEQ power_of_two ; 结果为0表示是2的幂

; 示例4:检查是否对齐到4字节边界
TST R0, #0x03   ; 检查低2位
BEQ aligned     ; 结果为0表示4字节对齐

汇编代码解读:

  • **示例3中的数学原理:**利用2的幂的二进制特性

    • 2的幂的二进制表示中只有一个1(如:1=0001, 2=0010, 4=0100, 8=1000)

    • 对于一个2的幂的数n,n & (n-1) = 0

      举例:

      text 复制代码
      // 2的幂的情况:
      n = 8 (1000)
      n-1 = 7 (0111)
      n & (n-1) = 1000 & 0111 = 0000 = 0
      
      // 非2的幂的情况:
      n = 6 (0110)
      n-1 = 5 (0101)
      n & (n-1) = 0110 & 0101 = 0100 ≠ 0
      
      // 例外:
      n = 0 (0000)
      n-1 = -1 (1111...)
      n & (n-1) = 0000 & 1111... = 0000 = 0
      // 注意:代码未处理n=0的情况,0不是2的幂但会通过此测试,实际应用中需要单独处理。
  • **示例4中的数学原理:**4字节对齐的地址,其二进制表示的最低2位必须为0

    • 4字节对齐 = 地址能被4整除
    • 二进制中:能被4整除 ⇔ 最低2位为00

与 AND、CMP 的区别

指令 功能 结果保存 更新标志
TST Rn & Op2 ❌ 不保存 ✅ 只更新标志
AND Rd = Rn & Op2 ✅ 保存到Rd ✅ 可选
CMP Rn - Op2 ❌ 不保存 ✅ 更新标志

典型应用场景

  1. 位测试:检查特定位是否为1
  2. 零值判断:快速检查寄存器是否为零
  3. 掩码测试:测试寄存器是否符合特定模式
  4. 条件执行:作为条件分支的前置测试

TST 是一个高效的测试指令,特别适合用于位操作和条件判断,避免了不必要的寄存器保存操作。

相关推荐
Zeku2 小时前
20251201 - 指令集架构中ARM和RISC-V的关系
arm开发·架构·risc-v
切糕师学AI2 小时前
ARM 汇编指令:BEQ
汇编·arm开发
若风的雨3 小时前
ARM Trusted Firmware 启动流程:从汇编到 C 语言的渐进式初始化
c语言·汇编·arm开发
xiaobuding_QAQ1 天前
51汇编仿真proteus8.15学习篇一(附源码)
汇编·单片机·学习·proteus
xiaobuding_QAQ1 天前
51汇编仿真proteus8.15学习篇二(附源码)
开发语言·汇编·单片机·学习·proteus
wanhengidc2 天前
巨椰 云手机 云游戏稳定运行
运维·服务器·arm开发·游戏·云计算
林政硕(Cohen0415)2 天前
ARM Qt 字体过小的问题
arm开发·qt
渡我白衣2 天前
计算机组成原理(7):定点数的编码表示
汇编·人工智能·嵌入式硬件·网络协议·机器学习·硬件工程
驱动探索者2 天前
[缩略语大全]之[ARM]篇
arm开发·ai编程