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

相关推荐
大阳1235 小时前
ARM.9(RGBLCD,PWM)
c语言·开发语言·汇编·单片机·嵌入式硬件·pwm·rgblcd
振南的单片机世界1 天前
HAL_Delay(1000)真准吗?SysTick的1ms基准从哪来
arm开发·stm32·单片机·嵌入式硬件
带土11 天前
3. ARM寄存器组织
arm开发
2301_789015621 天前
Linux基础开发工具一:软件包管理器、vim编辑器
linux·服务器·c语言·汇编·c++·编辑器·vim
是星辰吖~2 天前
X86反汇编_深度学习_基础二叉树
汇编
iCxhust2 天前
汇编返回指令ret iret retf区别
汇编·微机原理·8088单板机
xiangw@GZ2 天前
ARM TCM 紧耦合内存与 Cache 架构区别
arm开发·架构
XINVRY-FPGA2 天前
XCKU035-2FBVA676I AMD Xilinx Kintex UltraScale FPGA
arm开发·嵌入式硬件·网络安全·fpga开发·硬件工程·信号处理·fpga
少年、潜行2 天前
IAR FOR ARM 历史版本安装包、安装、注册流程【百度网盘资源】
arm开发·iar·iar历史版本·iar安装
Aaron15883 天前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理