我使用的是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还用于其他更改,在某些其他条件下也是如此)。这两个指令影响相同的标志。
check (x>=2)使用以下代码实现:addi -2,r7,r1。但是这条指令的标志结果,将被下一条指令清除,并且存在错误。至少,我认为是如此。
显然我错了。有人能解释一下这个反汇编程序片段吗?
发布于 2017-02-16 02:32:07
它按如下方式转换检查:
x >= 2 && x <= 5
= (x - 2) >= (2 - 2) && (x - 2) <= (5 - 2)
= (x - 2) >= 0 && (x - 2) <= 3这段代码将r1 (即x - 2 )与3进行比较,“如果不是更高则分支”,意思是0, 1, 2, or 3中的r1 (或2, 3, 4, or 5中的x )将分支以设置y = 1。
https://stackoverflow.com/questions/42257128
复制相似问题