ARM 32位汇编TST判断奇偶时为何addeq不对应奇数?
ARM 32位汇编
TST指令奇偶判断的核心逻辑拆解 认知错位的核心来源
你混淆了TST指令的标志位生成规则、以及ARM条件码的实际触发逻辑,把仅适用于比较类指令的“相等”语义直接套用到了位测试指令上。你观察到的“eq标志置位时反而代表两个位值不同”的现象,本质是因为eq在TST场景下根本不代表“两个操作数相等”,它只是Z位为1的状态标识,和操作数的位值匹配度没有任何关联。
TST指令的实际运行逻辑
TST是位测试类指令,核心执行流程没有“相等判断”的环节:
- 固定操作:对两个输入操作数做按位与运算,丢弃运算结果,仅根据运算结果更新当前程序状态寄存器(CPSR)的零标志位(Z位)
- 零标志的更新规则:
- 按位与结果为全0时,Z位置1
- 按位与结果非全0时,Z位清0
ARM条件码的触发规则
ARM架构中eq/ne条件码和“两个操作数是否相等”的绑定关系,仅在使用CMP类比较指令时成立;对于TST指令,条件码的触发只和Z位状态直接相关:
addeq:仅当Z位为1时执行指令addne:仅当Z位为0时执行指令
示例代码的逐场景验证
拿题目中的代码数值推导运行过程:
- 执行
mov R0, #167后,R0存储值167,其二进制最低有效位为1 - 执行
TST R0, #1:按位与的两个操作数分别是0b...10100111和0b...00000001,运算结果为0b...00000001,属于非全0结果,因此Z位被清0 - 条件分支匹配:
addeq要求Z位为1,当前Z位为0,因此奇数场景下不会触发执行addne要求Z位为0,当前Z位为0,因此会正常触发奇数场景的加法逻辑
奇偶判断的自洽逻辑
这套写法的设计完全和架构规则匹配:
- 偶数的最低有效位为0:
TST R0, #1的按位与结果为0,Z位置1,匹配addeq的执行条件,对应偶数处理分支 - 奇数的最低有效位为1:
TST R0, #1的按位与结果为1,Z位清0,匹配addne的执行条件,对应奇数处理分支
内容的提问来源于stack exchange,提问作者Tetsuo Rulin
相关产品推荐
相关产品推荐

