nasm用XMM寄存器计算double类型累加
生活随笔
收集整理的這篇文章主要介紹了
nasm用XMM寄存器计算double类型累加
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
global ?sumsection .text
sum:xorpd ? xmm0, xmm0 ? ? ? ? ? ? ?; initialize the sum to 0 初始化xmm0cmp ? ? 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就可以了
總結
以上是生活随笔為你收集整理的nasm用XMM寄存器计算double类型累加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: while及do while语句
- 下一篇: 2019美和易思第十一期班主任选拔培训(