Gcc 在汇编语言中,如何移动双精度数组中的元素?
我将一个双精度数组传递到一个函数中,如何将每个元素移动到相应的SSE寄存器中?如何将指定值移动到XMM寄存器中?我正在使用AT&T语法和GNU汇编程序Gcc 在汇编语言中,如何移动双精度数组中的元素?,gcc,assembly,x86-64,sse,att,Gcc,Assembly,X86 64,Sse,Att,我将一个双精度数组传递到一个函数中,如何将每个元素移动到相应的SSE寄存器中?如何将指定值移动到XMM寄存器中?我正在使用AT&T语法和GNU汇编程序 _variance: push %rbp movq %rsp, %rbp xorq %r8, %r8 movq %rdi, %r9 movsd $0, %xmm1 movsd $0, %xmm2 cvtsi2sd %r9, %xmm3 dec
_variance:
push %rbp
movq %rsp, %rbp
xorq %r8, %r8
movq %rdi, %r9
movsd $0, %xmm1
movsd $0, %xmm2
cvtsi2sd %r9, %xmm3
decq %r9
jmp 2f
1: movd (%rsi, %r8, 8), %xmm0
addsd %xmm0, %xmm2
mulsd %xmm0, %xmm0
addsd %xmm0, %xmm1
incq %r8
2: cmpq %r8, %r9
jl 1b
divsd %xmm3, %xmm1
divsd %xmm3, %xmm2
mulsd %xmm2, %xmm2
subsd %xmm1, %xmm2
movsd %xmm2, %xmm0
pop %rbp
ret
.size _variance,.-variance
下面是C程序:
#include<stdio.h>
variance(int n, double x[]);
int main(void) {
double array[10] = {5.5, 3.4, 7.7, 3.2, 9.1, 113.5, .125, 33.2, 93.2, .00001};
int number = 10;
double answer = variance(number, array);
printf("Variance is: %d\n", answer);
return 0;
}
#包括
方差(整数n,双x[]);
内部主(空){
双数组[10]={5.5,3.4,7.7,3.2,9.1,113.5,125,33.2,93.2,00001};
整数=10;
双答案=方差(数字、数组);
printf(“差异为:%d\n”,答案);
返回0;
}
我在计算一系列变量的方差。以下是函数:
double sum1, sum2;
int i = 0;
while(i < n-1) {
sum1 = sum1 + (x[i] * x[i]);
sum2 = sum2 + x[i];
}
sum1 = sum1 / n;
sum2 = sum2 / n;
sum2 = sum2 * sum2;
return sum1 - sum2;
double-sum1,sum2;
int i=0;
而(i
您能告诉我们到目前为止您都做了哪些尝试吗?如果您有一个特定的问题,并且可以演示您尝试过(但失败了)的内容,您可能更有可能在这方面获得一些帮助。使用代码编辑。不接受立即值。它可以采用XMM寄存器或包含64位双精度浮点的内存操作数。要将整个XMM寄存器归零,更简单的方法是对源和目标使用相同的寄存器。如果需要将双精度浮点(64位)从内存移到XMM寄存器,您可能希望查看指令。您可以使用一次读取多个浮点值,但起点是一次处理一个双浮点值。@MichaelPetch是正确的。对于Linux/ELF ABI,应该没有带变量的前导下划线。有些ABI确实有一个前导下划线,比如Mach-O(OSX)。你能告诉我们到目前为止你都做了些什么吗?如果您有一个特定的问题,并且可以演示您尝试过(但失败了)的内容,您可能更有可能在这方面获得一些帮助。使用代码编辑。不接受立即值。它可以采用XMM寄存器或包含64位双精度浮点的内存操作数。要将整个XMM寄存器归零,更简单的方法是对源和目标使用相同的寄存器。如果需要将双精度浮点(64位)从内存移到XMM寄存器,您可能希望查看指令。您可以使用一次读取多个浮点值,但起点是一次处理一个双浮点值。@MichaelPetch是正确的。对于Linux/ELF ABI,应该没有带变量的前导下划线。有些ABI确实有一个前导下划线,比如Mach-O(OSX)。