我已经在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
,方式相同
我不明白原因。为什么需要以这种奇怪的方式使用这些全局常量?
答案 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");