2017-02-15 56 views
0

我正在使用RH850控制器和編譯器greenHills在C語言。在範圍內檢查是這樣的:檢查值是否在diapason拆卸

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。但是這個指令的標誌結果將被下一個清除,並且不正確。至少我是這麼認爲的。

顯然我錯了。有人可以解釋這個反彙編片段嗎?

+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – Olaf

回答

2

據變換所述檢查如下:

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(或在2, 3, 4, or 5xr1將跳轉到設置y = 1

+0

我的問題不是邏輯。它是用於標誌的。我認爲「addi」會設置一些標誌,但是「cmp」會再次改變它們。而我雖然從「addi」的標誌將會丟失。 –

+0

他們迷路了,但你只需要'cmp'的結果。 –