ARM汇编BLT指令分支异常问题:特定数值下为何触发分支?
ARM汇编BLT指令跳转异常原因解析
首先明确:BLT是有符号数小于时触发跳转的指令,它基于CMP指令更新的CPU标志位(主要是N位和V位)判断,而非无符号数的大小比较。
先看你的代码片段:
label . . . CMP r2,r3 BLT label
测试案例分析
r2=0x82000000,r3=0x0时触发跳转
32位有符号数中,最高位为符号位:0x82000000的最高位是1,代表负数;0x0是零。负数必然小于零,满足BLT的跳转条件,所以触发分支是正确的。r2=r3=0x82000000时未触发跳转
CMP r2,r3本质是计算r2 - r3,结果为0时CPU的相等标志位(Z位)会被置位。而BLT仅在有符号数r2 < r3时跳转,相等的情况不满足条件,所以不会触发分支,这也是符合指令逻辑的。
关键误区提示
不要混淆有符号与无符号比较的跳转指令:
- 有符号比较:
BLT(小于)、BGT(大于)、BLE(小于等于)、BGE(大于等于) - 无符号比较:
BLO(小于,对应Below)、BHI(大于,对应Higher)、BLS(小于等于)、BHS(大于等于)
如果你的场景需要无符号数比较,应该使用对应的无符号跳转指令,而非BLT。
内容的提问来源于stack exchange,提问作者Bittu
相关产品推荐
相关产品推荐

