2016-11-02 17 views
1

我很難理解程序集中的條件代碼。右邊的程序集是爲了左邊的funA(),但是我在裝配中的線3-4有問題。有條件的標誌組件 - cmp,test

這裏是我的思維過程:

cmp rax, rcx // a[idx] <= *b 

然而,實際如果在代碼語句是完全相反的。我知道它與裝配中的方式有​​關,條件執行是相反的...因此它改爲[idx]> * b。 這是否與「jle」有關?有人會介意給我解釋嗎?

enter image description hereenter image description here

+0

這與C#有什麼關係? – fuz

+0

他只是想引起Jon Skeet的注意:D – Jester

回答

2

如果你看看.L1和.L2,JIT編譯器剛剛決定顛倒順序 - 它首先把else代碼,並扭轉了條件。 jle是「跳轉,如果小於或等於」,所以它成爲C#的等價物:

if (a[idx] <= *b) 
{ 
    *b = *b + *b; 
} 
else 
{ 
    *b = a[idx]; 
} 
+0

謝謝!當它被這樣寫出來時,它會更有意義。我會確保下次再做,所以我不會迷惑自己。 – helloworld