簡體   English   中英

匯編代碼中的靜態值

[英]Static Values in Assembler Code

我有以下簡單的代碼:

#include <cmath>
struct init_sin
{
    typedef double type;
    static constexpr type value(int index) {
        return 3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999);
    }
};

int main(){
    static double VALUE = init_sin::value(10);

    double VALUE_NONSTAT = 3*std::pow(std::sin(10 * 2.0 * 3.1415 / 20.0),1.999);

    return int(VALUE_NONSTAT);
}

我想知道匯編代碼的含義是什么。 這里是組件的鏈接: http//pastebin.com/211AfSYh
我認為VALUE是計算的編譯時間,並直接作為匯編程序代碼中的值,如果我沒有弄錯的話應該在這一行中:

33                      .size   main, .-main
  34                    .data
  35                    .align 8
  36                    .type   _ZZ4mainE5VALUE, @object
GAS LISTING /tmp/ccbPDNK8.s             page 2


  37                    .size   _ZZ4mainE5VALUE, 8
  38                _ZZ4mainE5VALUE:
  39 0000 15143B78      .long   2017137685
  40 0004 45E95B3E      .long   1046210885
  1. 為什么.long有兩個值? 為什么這些類型很長? (它是一個雙重?,也許在匯編程序中只有很長時間。
  2. 這是否意味着VALUE是生成的編譯時間
  3. VALUE_NON_STATIC的結果在哪里? 這應該在運行時計算嗎? 我不太清楚在哪里?

非常感謝!

這個匯編語法中的.long意味着一個32位的數字。 因為double是64位,所以你看到的是兩個32位的VALUE部分,它們的double表示。 您還會注意到它正在與8字節邊界(通過.align語句)對齊,並且它的大小為8(通過.size語句)。 此外,它位於主.data段中,通常用於初始化為零的全局范圍變量(作為旁注, .bss通常用於零初始化的全局范圍變量)。

可以看到VALUE_NONSTAT被加載到%rax這里,這是AX寄存器的64位版本:

             V
 20 0004 48B81514              movabsq $4493441537811354645, %rax
 20      3B7845E9
 20      5B3E

回想一下15143B7845E95B3E3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999)的值的表示,當存儲在double ,你可以看到以十六進制開始的內部值我插了一個V

稍后語句然后將其推入堆棧( movq %rax, -8(%rbp) ),然后將其加載到FP寄存器( movsd -8(%rbp), %xmm0 ),然后將其轉換為整數並將其存儲在%eax ,它是返回值的寄存器( cvttsd2si %xmm0, %eax ),然后使用ret從例程返回。

在任何情況下,在您正在使用的優化級別(可能在下面),您的編譯器已經發現VALUE_NONSTAT是一個常量表達式,而只是在編譯時將其內聯,因為該值在編譯時是完全已知的。

暫無
暫無

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

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