簡體   English   中英

-O0 與 -O3 中 __rdtsc() 的匯編代碼

[英]Assembly code for __rdtsc() in -O0 vs -O3

我有以下代碼:

#include <x86intrin.h>

int main() {
    return __rdtsc();
}

我試圖在我的機器(Intel i7-6700 CPU)和objdump上編譯

g++ -Wall test_tsc.cpp -o test_tsc -march=native -mtune=native -O0 -std=c++20
objdump -M intel -d test_tsc > test_tsc.O0

然后在test_tsc.O0

0000000000401122 <main>:
  401122:   55                      push   rbp
  401123:   48 89 e5                mov    rbp,rsp
  401126:   0f 31                   rdtsc  
  401128:   48 c1 e2 20             shl    rdx,0x20
  40112c:   48 09 d0                or     rax,rdx
  40112f:   90                      nop
  401130:   5d                      pop    rbp
  401131:   c3                      ret    
  401132:   66 2e 0f 1f 84 00 00    nop    WORD PTR cs:[rax+rax*1+0x0]
  401139:   00 00 00 
  40113c:   0f 1f 40 00             nop    DWORD PTR [rax+0x0]

push rbpmov rbp,rsp有什么作用? 看起來他們是為了保存堆棧指針,但實際上並沒有 function 調用。 如果 g++ 考慮__rdtsc()一個 function 調用,那么之后會有類似call的東西嗎?

謝謝。

rbp是基指針,而不是堆棧指針。 基指針用於調試期間的回溯,但實際運行時不需要。

它通過 function 調用保留,因此使用-O3僅生成預期的程序集:

main:
        rdtsc
        salq    $32, %rdx
        orq     %rdx, %rax
        ret

暫無
暫無

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

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