2017-02-28 46 views
5

我想交流的功能代碼比較組件的等價和種類上有條件的困惑跳條件跳轉 - 比較C代碼彙編

enter image description here

我擡頭jl指令,它說如果跳<跳,但問題的答案是>=有人可以解釋爲什麼是這樣嗎?

+0

Fow哪種處理器類型是這種彙編語言?摩托羅拉68000? – Codor

+1

'<' and '> ='是彼此反轉。前者(用'<')可能是更少或更快的指令,所以這是一個優化問題。 –

+0

它是x86彙編intel? – user2584325

回答

4

就我的理解,條件是相反的,但邏輯是一樣的; C源限定

如果條件被滿足時,執行下面的塊

而彙編源限定

如果條件被違反,則跳過下面的塊

這意味着執行流程在兩個實現中都是相同的。

+0

夠搞笑的,在這種情況下不是情況發生了變化。但運營商的順序。這兩個條件是「如果少」,在asm中它是「jl」(與C代碼中的「if <」相同),但不是'a Tommylee2k

2

從本質上講,這個程序集正在做什麼,是在設置它時執行條件,但是使用負邏輯。

你的條件說:

如果是小的,那麼B,返回X。否則,返回y。

彙編代碼說什麼(簡化):

移Y到緩衝器返回。將b移到不同的緩衝區中。 如果a大於b,則跳轉到返回步驟。然後y返回 。如果a不大於b,則繼續執行程序。下一步 步驟將x分配給返回緩衝區。之後的步驟返回爲 正常。

結果是一樣的,但過程略有不同。

+0

在您的解釋中丟失了'a' –

+0

@MichałWalenciak謝謝。我修改了答案。我錯誤地寫了一個for x在那裏。 – Magisch

1

大會確實,一行行(不包括代碼,因爲你張貼作爲圖像):

foo: 
    return_value (eax) = y; // !!! 
    temporary_edx = b;  // x86 can't compare memory with memory, so "b" goes to register 
    set_flags_by(a-b);  // cmp does subtraction and discards result, except flags 
    "jump less to return" // so when a < b => return y (see first line) 
    return_value (eax) = x; 
    return 

所以作出這樣的C代碼做同樣的事情,你需要:

if (a >= b) { return x; } else { return y; } 

BTW,看到它是多麼容易翻轉:

if (a < b) { return y; } else { return x; } 

所以沒有點翻譯jl進入「少」到C,你必須追蹤每個分支,真正發生的情況,併爲每個計算分支尋找正確的C側計算,然後在C中「創建」條件以在兩側獲得相同的計算,所以這個任務不是關於「翻譯」程序集,而是關於解密asm邏輯+將其重寫回C.看起來你完全錯過了這一點,並希望你可以放棄一些簡單的「匹配模式」翻譯,而你必須完全解決。