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

相关推荐
AndyHeee12 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影12 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen12 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
ThornArmor12 天前
【工具篇·番外】跨语言生态的主权回收:基于 ISA 说明书的 4-bit 双向汇编系统全线封顶
c语言·开发语言·汇编·c++·重构·架构
振南的单片机世界12 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件
墨绿色的摆渡人12 天前
论文笔记(一百三十七)Learning Dual-Arm Push and Grasp Synergy in Dense Clutter
arm开发·论文阅读
暮云星影13 天前
全志linux开发屏幕适配(一)屏幕参数设置说明
linux·arm开发
是星辰吖~13 天前
WIN32_线程(下)
汇编
m0_5474866613 天前
《ARM Cortex-M4嵌入式应用技术——基于STM32F407、STM32CubeMX与Proteus》全套PPT课件
arm开发·stm32·proteus
Lanceli_van13 天前
SQLite 3.45.2(sqlite-autoconf-3450200)ARM 交叉编译完整步骤
arm开发·sqlite