检查 value 是否在 diapason 反汇编中

Check if value is in diapason disassembly

我正在使用C语言的RH850控制器和编译器greenHills。在这样的范围内检查:

if ((x>=2) && (x<=5))
    y=1

它是用Osize选项编译的。编译后看起来像这样:

zxb r7
addi -2,r7,r1
cmp 3,r1
bnh .L1295

.L1295y=1的标签(这个y=1用于其他变化,在其他一些条件下也是如此)。两条指令影响相同的标志。

校验(x>=2)是用这段代码实现的:addi -2,r7,r1。但是这个指令的标志结果,将被下一个清除并且不正确。至少我是这么认为的。

显然我错了。有人可以解释这个反汇编程序片段吗?

正在对支票进行如下改造:

  x >= 2 && x <= 5
= (x - 2) >= (2 - 2) && (x - 2) <= (5 - 2)
= (x - 2) >= 0 && (x - 2) <= 3

代码将 r1,即 x - 2,与 3 和 "branches if not higher" 进行比较,表示 0, 1, 2, or 3 中的 r1(或 x in 2, 3, 4, or 5) 将分支到集合 y = 1.