【发布时间】:2017-12-24 00:20:57
【问题描述】:
我是使用 SIMD 指令的新手,我正在尝试使用 printf 打印浮点数。我查看了许多可能的解决方案,但似乎这段代码在运行时没有打印任何内容。以下是相关代码:
extern _printf
section .text
global _main
_main:
...
movapd xmm0, oword [rel v1]
movapd xmm1, oword [rel v2]
addpd xmm0, xmm1
movapd xmm1, xmm0
psrldq xmm1, 8
mov rax, 2
mov rdi, fmt
call _printf
...
section .data
fmt: db "%f %f\n", 0
v1: dq 1.1
dq 2.2
v2: dq 3.3
dq 4.4
我正在使用 mac,这里是我用来组装和链接的命令:
nasm -g -f macho64 -o prog.o prog.asm
ld -lc -macosx_version_min 10.13 -lSystem -o prog prog.o
【问题讨论】:
-
你检查了调用约定吗?为什么你期望
printf从 xmm0 读取两个双精度数? -
我不确定,但怀疑我只是在一个寄存器 (xmm0) 中传递浮点数。您是否建议将一个浮点数放入 xmm1 并将 2 个放入 rax?
-
是的。 x86-64 System V 调用约定不会将单独的 FP args 打包到一个向量寄存器中。顺便说一句,您打印的是
double,而不是float。 printf 没有为float转换,因为 C 调用者永远不能在没有提升到double的情况下传递一个。 -
我将其更改为在两个寄存器中传递它们并编辑了问题中的代码,但是程序仍然没有打印任何内容。另外,我知道我正在打印双打,我只是在使用惰性术语
-
别偷懒了;根据您的问题标题,我期待 stackoverflow.com/questions/37082784/… 的副本。
标签: assembly x86 nasm sse simd