回答
就我的理解,條件是相反的,但邏輯是一樣的; C源限定
如果條件被滿足時,執行下面的塊
而彙編源限定
如果條件被違反,則跳過下面的塊
這意味着執行流程在兩個實現中都是相同的。
夠搞笑的,在這種情況下不是情況發生了變化。但運營商的順序。這兩個條件是「如果少」,在asm中它是「jl」(與C代碼中的「if <」相同),但不是'a Tommylee2k
從本質上講,這個程序集正在做什麼,是在設置它時執行條件,但是使用負邏輯。
你的條件說:
如果是小的,那麼B,返回X。否則,返回y。
彙編代碼說什麼(簡化):
移Y到緩衝器返回。將b移到不同的緩衝區中。 如果a大於b,則跳轉到返回步驟。然後y返回 。如果a不大於b,則繼續執行程序。下一步 步驟將x分配給返回緩衝區。之後的步驟返回爲 正常。
結果是一樣的,但過程略有不同。
在您的解釋中丟失了'a' –
@MichałWalenciak謝謝。我修改了答案。我錯誤地寫了一個for x在那裏。 – Magisch
大會確實,一行行(不包括代碼,因爲你張貼作爲圖像):
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.看起來你完全錯過了這一點,並希望你可以放棄一些簡單的「匹配模式」翻譯,而你必須完全解決。
- 1. 口譯彙編代碼比較
- 2. 如何避免彙編代碼時跳轉和跳轉?
- 3. C++彙編代碼
- 4. 彙編&C - 翻譯C'S代碼彙編
- 5. 在彙編中比較比特
- 6. 將C代碼轉換爲MIPS彙編
- 7. Mips彙編語言轉換C條件
- 8. 彙編代碼跳過一行?
- 9. 從c反彙編代碼#
- 10. 反彙編C代替操作代碼
- 11. 寫彙編代碼的C++
- 12. C代碼MIPS彙編
- 13. C++代碼中的彙編代碼
- 14. 從C#代碼生成彙編代碼?
- 15. 彙編代碼到C代碼
- 16. 彙編代碼中找不到跳轉表
- 17. 轉換C代碼,以MIPS(彙編源代碼)
- 18. 試圖將此彙編代碼轉換爲C代碼
- 19. 將彙編代碼轉換爲C代碼
- 20. 如何修改用於條件跳轉的x86彙編標誌?
- 21. 跳轉通過git比較
- 22. Valgrind:條件跳轉,未初始化的值,C++基本代碼
- 23. 編譯C代碼到MIPS彙編
- 24. 含義的彙編代碼
- 25. 彙編代碼
- 26. 閱讀彙編代碼
- 27. php編譯器比較代碼?
- 28. 條件彙編
- 29. 彙編語言:如何比較8086中的輸入號碼?
- 30. Mac C++ GUI編碼 - 與Win32比較
Fow哪種處理器類型是這種彙編語言?摩托羅拉68000? – Codor
'<' and '> ='是彼此反轉。前者(用'<')可能是更少或更快的指令,所以這是一個優化問題。 –
它是x86彙編intel? – user2584325