日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nasm用XMM寄存器计算double类型累加 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
global ?sumsection .text sum:xorpd ? xmm0, xmm0 ? ? ? ? ? ? ?; initialize the sum to 0 初始化xmm0cmp ? ? rsi, 0 ? ? ? ? ? ? ? ? ?; special case for length = 0 rsi計(jì)數(shù)je ? ? ?done ; //計(jì)數(shù)到了,就done,退出 next:addsd ? xmm0, [rdi] ? ? ? ? ? ? ; add in the current array element rdi是一個(gè)偏移,用于取數(shù)組的地址, rdi默認(rèn)存儲的是數(shù)組的首地址add ? ? rdi, 8 ? ? ? ? ? ? ? ? ?; move to next array element rdi 增加一個(gè)偏移dec ? ? rsi ? ? ? ? ? ? ? ? ? ? ; count down 計(jì)數(shù)減少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; }

那我們可不可以用別的寄存器計(jì)算累加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, 最終把得到的結(jié)果放到xmm0就可以了

總結(jié)

以上是生活随笔為你收集整理的nasm用XMM寄存器计算double类型累加的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。