Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 在汇编语言中,如何移动双精度数组中的元素?_Gcc_Assembly_X86 64_Sse_Att - Fatal编程技术网

Gcc 在汇编语言中,如何移动双精度数组中的元素?

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

我将一个双精度数组传递到一个函数中,如何将每个元素移动到相应的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
    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)。