簡體   English   中英

GCC生成的程序集等效於C中的continue語句

[英]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.

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