You need to enable JavaScript to run this app. ARM 32位汇编TST判断奇偶时为何addeq不对应奇数?
优惠活动
大模型
产品
解决方案
定价
更多

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时执行指令

示例代码的逐场景验证

拿题目中的代码数值推导运行过程:

  1. 执行mov R0, #167后,R0存储值167,其二进制最低有效位为1
  2. 执行TST R0, #1:按位与的两个操作数分别是0b...10100111和0b...00000001,运算结果为0b...00000001,属于非全0结果,因此Z位被清0
  3. 条件分支匹配:
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 02:24:04