【问题标题】:Use of NASM's __?float?__ macros使用 NASM 的 __?float?__ 宏
【发布时间】:2021-03-04 13:39:53
【问题描述】:

NASM 手册讨论了这些宏,但据我所知,它并没有真正解释如何使用它们。 Section 3.4.6 状态:

浮点常量只能作为 DBDWDDDQDTDO 的参数,或作为特殊运算符 __?float8?__、@ 的参数987654329@、__?bfloat16?____?float32?____?float64?____?float80m?____?float80e?____?float128l?____?float128h?__

起初,我以为这是在数据部分之外使用浮点常量。但是当我尝试mov xmm0, __?float32?__(1.23) 时,我得到了“操作码和操作数的无效组合”错误。最终,我看到foo: dd __?float32?__(1.23) 有效。不过,这对我来说感觉很奇怪;如果你可以直接做dd 1.23,这些宏有什么意义?例如,如果您需要在四字中定义单精度浮点数,则可能是一种可能性。这真的是这些宏的唯一用途,还是我用错了?

【问题讨论】:

    标签: assembly x86-64 nasm


    【解决方案1】:

    这些宏不会改变 x86 没有具有直接源和 XMM 或 x87 目标的指令这一事实。请记住,NASM 是一个汇编器,而不是编译器。

    用例包括您希望将 FP 位模式 mov-immediate 到整数寄存器的罕见情况,例如 mov eax, __?float32?__(1.23)。之后你可能会做movd xmm0, eax,甚至是AVX-512 vpbroadcastd xmm0, eax

    通常编译器将 FP 数据从内存中的常量加载到寄存器中(这通常是一个不错的选择),但这不是唯一的方法。

    (由于有效的广播,AVX-512 使立即数更具吸引力,但您也可以仅使用 AVX1 或 SSE3 movddup 从内存广播双精度。编译器仍然使用内存常量作为标量浮点数,这通常仍然是什么我建议除非分析显示大量数据缓存未命中,而且一般程序中没有很多 I-cache 未命中。)

    或者对于像 if (x) *fp_ptr = 1.0; 这样的东西,您可能想要像 mov dword [rdi], __?float32?__(1.0) 这样的 mov-immediate 到内存。

    另一个用例可能是NASM %if conditional assembly directive,或者您希望将 FP 位模式作为整数值的其他情况,不是dd。虽然没有什么明智的想法。

    或作为__?float32?__(1.0) >> 23 之类的表达式的一部分来获取要用于某事的浮点常量的指数(和符号位)。


    记录在案:

    mov eax, __?float32?__(1.23)
    mov eax, __?float32?__(1.0) >> 23
    mov dword [rdi], __?float32?__(1.0)
    

    nasm -felf64 foo.asm组装,用objdump -drwC -Mintel foo.o拆卸

       0:   b8 a4 70 9d 3f          mov    eax,0x3f9d70a4
       5:   b8 7f 00 00 00          mov    eax,0x7f
       a:   c7 07 00 00 80 3f       mov    DWORD PTR [rdi],0x3f800000
    

    【讨论】:

    • 啊,是的,我刚刚用eax 尝试过,它成功了。我很愚蠢,事后不去尝试……我没有意识到你根本不能将文字放入 xmm 寄存器(我正在尝试学习向量和 SIMD)。不管怎样,你给了我一直在寻找的答案。
    • @mediocrevegetable1:另外请记住,mov 不能永远有 XMM 目标 (felixcloutier.com/x86/mov),所以下次获得指令时要检查另一件事不集合。可以写XMM寄存器的指令包括movd xmm, r/m32movdqu xmm, xmm/memvbroadcastss xmm, xmm/mem
    • 啊,好吧,我没有意识到这一点。我会查找这些说明,并感谢您的链接。
    • @mediocrevegetable1:用另一个看似合理且可能有趣的用例更新了我的答案:mov-immediate to memory,或者对 float32 位模式进行进一步的常量表达式数学运算。
    • 感谢您的更新。我没有考虑过为此使用它们,尤其是在位移时。很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多