检查值是否在diapason反汇编中

时间:2017-02-15 18:16:01

标签: c comparison compiler-optimization 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。但是该指令的标志结果将被下一个清除并且有错误。至少我是这么认为的。

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

1 个答案:

答案 0 :(得分:2)

它正在改变检查如下:

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

代码将r1 x - 23进行比较,将“分支(如果不是更高”)与r1中的0, 1, 2, or 3进行比较(或{{1}在} x)中将分支设置2, 3, 4, or 5