汇编代码中的静态值

 无语噶流浪 发布于 2023-02-12 17:46

我有以下简单的代码:

#include 
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

    为什么有两个值.long?为什么这些类型很长?(它是一个双重?,也许在汇编程序中只有很长时间.

    这是否意味着VALUE生成的编译时间的值

    VALUE_NON_STATIC的结果在哪里?这应该在运行时计算吗?我不太清楚在哪里?

非常感谢!

1 个回答
  • .long在这个汇编语法中意味着一个32位的数字.由于double是64位的,你看到的有两个32位的部分VALUE,在他们的double代表.您还会注意到它正在与8字节边界(通过.align语句)对齐,并且它的大小为8(通过.size语句).此外,它位于主.data段中,通常用于初始化为零的全局范围变量(作为旁注,.bss通常用于零初始化的全局范围变量).

    所述VALUE_NONSTAT可以看出被加载到%rax这里,这是的64位版本的AX寄存器:

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

    回想一下15143B7845E95B3E,3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999)当存储在a 中的值的表示时double,你可以看到十六进制内部值从我插入的位置开始V.

    稍后语句然后将其推入堆栈(movq %rax, -8(%rbp)),然后将其加载到FP寄存器(movsd -8(%rbp), %xmm0)中,然后将其转换为整数并将其存储在%eax其中,这是返回值(cvttsd2si %xmm0, %eax)的寄存器,然后使用从例程返回ret.

    在任何情况下,在您正在使用的优化级别(可能在下面),您的编译器已经发现它VALUE_NONSTAT是一个常量表达式,而只是在编译时将其内联,因为该值在编译时是完全已知的.

    2023-02-12 17:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有