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
TST 是 Test 的缩写。是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
- 零值判断:快速检查寄存器是否为零
- 掩码测试:测试寄存器是否符合特定模式
- 条件执行:作为条件分支的前置测试
TST 是一个高效的测试指令,特别适合用于位操作和条件判断,避免了不必要的寄存器保存操作。