Gcc NASM中.rodata.cst16共有项的目的是什么?

Gcc NASM中.rodata.cst16共有项的目的是什么?,gcc,reverse-engineering,nasm,Gcc,Reverse Engineering,Nasm,我已经在NASM中反汇编了使用gcc x64编译的各种C对象文件,在.rodata.cst16节中,总是声明了一些相同的全局变量 SECTION .rodata.cst16 LC4: ; dword dd 80000000H, 00000000H ; 0000 _ -0.0 0.0 d

我已经在NASM中反汇编了使用gcc x64编译的各种C对象文件,在.rodata.cst16节中,总是声明了一些相同的全局变量

SECTION .rodata.cst16  

    LC4:                                                    ; dword
            dd 80000000H, 00000000H                         ; 0000 _ -0.0 0.0 
            dd 00000000H, 00000000H                         ; 0008 _ 0.0 0.0 

    LC5:                                                    ; dword
            dd 80000000H, 00000000H                         ; 0000 _ -0.0 0.0 
            dd 00000000H, 00000000H                         ; 0008 _ 0.0 0.0 
下面是在代码部分使用这些常量的示例

 vmovss  xmm4, dword [rel LC4] 
是否都以相同的方式与AVX mov操作vmovssin的rel关键字一起使用


我不明白原因。为什么需要以这种奇怪的方式使用这些全局常量?

看起来它们是常量

更多细节。。。ummm、.rodata.cst16排序表示16字节宽的只读常量

通常,从内存地址加载寄存器比从文本值加载寄存器更容易、更快。再加上这些与xmms寄存器配合使用的事实,这就更有意义了

使用这些常量之一加载xmms寄存器可能比尝试将一堆零加载到xmms寄存器的各个“插槽”中要快

我自己在我的代码中也做过类似的事情,这更简单,也就像把“幻数”放入一个常数,而不是洒在代码上

有点像这样:

#define NUMBER_LIONS 27
const int NUMBER_TIGERS = 23;
const float NUMBER_BEARS = 4.2f;
...
  double animal_salad = (double)(NUMBER_LIONS + NUMBER_TIGERS) / NUMBER_BEARS;
...
  printf("Oh My!\n");

谢谢你的回答。我知道这些都是常数,但我不知道该如何读取常数。常数LC4是什么意思?什么是vmovss xmm4,dword[rel LC4]LC4-ndisassem,vmovss xmm4,dword[rel LC4]生成的随机/顺序标签。。。该位置的指令。UH向量将某些类型从相对位置LC4处的dword移到xmm4寄存器中。不要经常使用vmovss指令,不要完全记住。我不知道你不明白什么。如果我有UnderTod rip relative,请使用声明为costant的内存地址,使代码位置的指令独立。但我不明白为什么有4个十六进制值被标记为一个常量。e、 g.十进制的80000000小时是2147483648,其他00000000小时都是0。。。为什么?因为xmm寄存器是128位宽。。。需要16个字节来加载值。查找xmm寄存器的信息,它们是向量寄存器,能够同时处理多个值。也许还可以查找向量寄存器x86_64 assembly.ok,但这些值表示随机生成的内存地址,或者这些值有什么特殊之处?在我所看到的所有64位反编译程序集中,总是有一个只读全局常量,其值正好与avx指令相同