[英]GCC generated assembly equivalent to continue statement in C
當在C代碼的循環內使用continue語句時,GCC會在循環塊結束之前創建一個帶有nop指令的新標簽,然后跳轉到該標簽,而不是跳轉到循環塊本身的末尾。 例如,以下C代碼
for (i=0; i<10; i++) {
puts("blah\n");
if (i < 10) continue;
puts("This shouldn't be printed.\n");
}
產生以下等效的ASM(使用gcc -S):
movl $0, 28(%esp)
jmp L2
L5:
movl $LC0, (%esp)
call _puts
cmpl $9, 28(%esp)
jle L7
L3:
movl $LC1, (%esp)
call _puts
jmp L4
L7:
nop
L4:
incl 28(%esp)
L2:
cmpl $9, 28(%esp)
jle L5
(插入了if(i <10)部分,以便編譯器不會通過刪除繼續語句后的內容來“優化”該部分)
我的問題是,為什么不直接跳到L4? IMO,我們也可以跳到L4,我錯過了什么嗎?
您要描述的是一種優化。 果然,如果您告訴gcc優化( -O1
就足夠了),它將完全按照您的描述進行操作。
我的猜測是,它是某種跳過代碼修復序列的占位符。 也許nop
有時會替換為將寄存器存儲到堆棧等的指令。
但是要獲得更多證據,這將有助於找到一個示例,其中將nop
替換為其他內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.