簡體   English   中英

匯編中無法訪問的代碼

[英]Unreachable code in assembly

我正在調試linux中的崩潰,正在通過cxa_finalize函數的匯編

崩潰發生在看起來無法訪問的源代碼行上:

cmp    %edx,%esi             // f >= &funcs->fns[0]
jae    0xb6e17b88            // enter for loop
jmp    0xb6e17c08            // exit for loop
lea    0x0(%esi,%eiz,1),%esi // crashes here - how do we even get here since there is a 
                             // jmp above us, and nothing jumps to here
cmp    %edi,0xc(%esi)        // d == f->func.cxa.dso_handle (jumped to from below)

在此方法的后續步驟中,在jmpnop之后出現了另一個lea 0x0(%esi,%eiz,1),%esi指令,該指令也似乎無法訪問。 在這種情況下, jmp也將退出for循環。

這里是否存在一些無法實現的指令范式?

編輯:事實證明,當訪問esi的內存時,它不會在lea指令上崩潰,而是在它之后的cmp指令上崩潰。

我在這里找到答案

有時,GCC會將NOP指令插入代碼流中,以確保正確的對齊方式和類似的東西。 NOP指令占用一個字節,因此您會認為可以根據需要添加任意數量。 但是根據Ian Lance Taylor的說法,芯片執行一條長指令的速度比許多短指令的速度快。 因此,與其插入七個NOP指令,不如使用一個bizarro LEA,它占用七個字節,並且在語義上等效於NOP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM