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

相关推荐
森焱森4 小时前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化
森G17 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
VekiSon20 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
AI+程序员在路上21 小时前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
17(无规则自律)1 天前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
浩浩测试一下1 天前
内网---> WriteOwner权限滥用
网络·汇编·windows·安全·microsoft·系统安全
一品人家1 天前
win32汇编使用GDI+入门教程之九
汇编·windows·win32汇编
梁洪飞2 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
虚构之人2 天前
二进制漏洞挖掘(WinAFL Fuzzing)Windows篇
汇编·网络安全·信息安全·系统安全
代码游侠2 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构