我在C语言中使用RH850控制器和编译器greenHills。在范围内检查如下:
if ((x>=2) && (x<=5))
y=1
使用Osize选项进行编译。在编译时,它看起来像这样:
zxb r7
addi -2,r7,r1
cmp 3,r1
bnh .L1295
.L1295
是y=1
的标签(此y=1
用于其他更改,在某些其他条件下也是如此)。两条指令都影响了相同的标志。
使用以下代码实现支票(x>=2)
:addi -2,r7,r1
。但是该指令的标志结果将被下一个清除并且有错误。至少我是这么认为的。
显然我错了。有人可以解释这个反汇编片段吗?
答案 0 :(得分:2)
它正在改变检查如下:
x >= 2 && x <= 5
= (x - 2) >= (2 - 2) && (x - 2) <= (5 - 2)
= (x - 2) >= 0 && (x - 2) <= 3
代码将r1
x - 2
与3
进行比较,将“分支(如果不是更高”)与r1
中的0, 1, 2, or 3
进行比较(或{{1}在} x
)中将分支设置2, 3, 4, or 5
。