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就可以了