[英]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)
在此方法的后續步驟中,在jmp
和nop
之后出現了另一個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.