【发布时间】:2021-11-07 15:44:54
【问题描述】:
据我所知,不可能使用一条指令直接在寄存器中移动浮点数,如下所示:
fld 0.5
或
movsd xmm0 , 0.4
我想制作一个宏,将浮点值存储到内存中,然后存储到寄存器中,如下所示:
%macro fld_macro 1
section .data
_%1 : dq %1
section .text
fld qword [_%1]
%endmacro
我的问题是我想在执行宏之前先检查该值是否已经存在。大致如下:
%macro fld_macro 1
(if _%1 doesnt exist , then )
section .data
_%1 : dq %1
section .text
fld qword [_%1]
(else )
%endmacro
这可能吗?我正在使用 nasm (-fwin64 ) 和 gcc
【问题讨论】:
-
什么指令集以及指令集文档对此有何评论?
-
我想你的意思是
movsd或movq。唯一的movsq是可以与rep一起使用的字符串指令。但无论如何,不幸的是 x86 没有适用于 x87 或 SSE2/AVX/AVX-512 的 mov-immediate。 (ARM 可以,使用少量立即数位,可让您构造一些常见的整数 FP 值,如 2.0 或 0.5) -
原则上,您可以将编码浮点/双精度的 32 位或 64 位立即数移动到整数寄存器中,然后将
movd或movq移动到 SSE 寄存器中。但听起来你真正想要的根本不是立即数——你希望你的数字在内存中,但你不想让相同的值占用内存两次。那种常量合并或去重通常由编译器完成,或者可能是一个非常花哨的链接器,但我认为它可能超出了汇编器的能力。
标签: assembly x86 floating-point nasm