global sum section .text sum: xorpd xmm0, xmm0 ; initialize the sum to 0 初始化xmm0 cmp rsi, 0 ; special case for length = 0 rsi计数 je done ; //计数到了,就done,退出 next: addsd xmm0, [rdi] ; add in the current array element rdi是一个偏移,用于取数组的地址, rdi默认存储的是数组的首地址 add rdi, 8 ; move to next array element rdi 增加一个偏移 dec rsi ; count down 计数减少 jnz next ; if not done counting, continue done: ret ; return value already in xmm0
最终的返回值,保存在xmm0中。
/*
* Illustrates how to call the sum function we wrote in assembly language.
*/
#include <stdio.h>
#include <inttypes.h>
double sum(double[], uint64_t);
int main() {
double test[] = {
40.5, 26.7, 21.9, 1.5, -40.5, -23.4
};
printf("%20.7f\n", sum(test, 6));
printf("%20.7f\n", sum(test, 2));
printf("%20.7f\n", sum(test, 0));
printf("%20.7f\n", sum(test, 3));
return 0;
}
那我们可不可以用别的寄存器计算累加double和呢?答案是可以的。
global sum
section .text
sum:
xorpd xmm1, xmm1
cmp rsi, 0
je done
next:
addsd xmm1, [rdi]
add rdi, 8;add 命令作用于寄存器xmm0
dec rsi
jnz next
done:
movsd xmm0, xmm1
ret
我们初始化寄存器xmm1, 最终把得到的结果放到xmm0就可以了
本文探讨了如何使用xmm1和xmm0两个寄存器进行并行计算,优化了double数组求和的过程。通过实例展示了在Assembly语言中重新组织代码以提高性能,特别关注了内存操作和寄存器选择对性能的影响。


被折叠的 条评论
为什么被折叠?



