日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

nasm用XMM寄存器计算double类型累加

發布時間:2024/3/12 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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类型累加的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。