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

相关推荐
188号安全攻城狮7 小时前
【PWN】HappyNewYearCTF_9_ret2syscall
linux·汇编·安全·网络安全·系统安全
万法若空9 小时前
Vim常用指令汇编
汇编·编辑器·vim
byte轻骑兵1 天前
ARM 嵌入式处理器内核与架构深度剖析(3): ARM嵌入式处理器的架构组成
arm开发
Jing_jing_X1 天前
CPU 架构:x86、x64、ARM 到底是什么?为什么程序不能通用?
arm开发·架构·cpu
芙蓉王真的好11 天前
安全无篡改:Windows 10 22H2/LTSC/ARM 官方原版镜像下载渠道与使用教程
arm开发·windows·安全
请输入蚊子1 天前
«操作系统真像还原» 第二章 编写MBR主引导记录
linux·汇编·操作系统·bochs·操作系统真像还原
188号安全攻城狮1 天前
【PWN】HappyNewYearCTF_8_ret2csu
linux·汇编·安全·网络安全·系统安全
切糕师学AI1 天前
ARM 架构中的复位(Reset)与复位流程
arm开发·单片机·嵌入式·复位
VekiSon1 天前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
MickyCode1 天前
嵌入式开发调试之Traceback
arm开发·stm32·单片机·mcu