NASM中.rodata.cst16常量的目的是什么?

时间:2014-06-21 02:40:40

标签: gcc reverse-engineering nasm

我已经在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] 

rel关键字一起用于AVX mov操作vmovss,方式相同

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

1 个答案:

答案 0 :(得分:0)

看起来他们是常数。

更多细节...嗯,.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");