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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

第41部分-Linux x86 64位汇编MMX使用

發(fā)布時間:2023/12/3 linux 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第41部分-Linux x86 64位汇编MMX使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第41部分-Linux x86 64位匯編MMX使用

使用MMX架構(gòu)需要一下步驟

  • 從整數(shù)值創(chuàng)建打包整數(shù)值
  • 把打包整數(shù)值加載到MMX寄存器中
  • 對打包整數(shù)值執(zhí)行MMX數(shù)學操作。
  • 從MMX寄存器獲得結(jié)果放到內(nèi)存位置中。
  • 加載和獲得打包的整數(shù)值,使用movq指令把整數(shù)值傳送進/出MMX寄存器。

    對比打包整數(shù)值操作,同時計算多個結(jié)果值,單一一組標志不能表示操作的結(jié)果。可以從執(zhí)行數(shù)學操作的3種溢出方法中選擇: 環(huán)繞/帶符號飽和/無符號飽和。

    帶符號和無符號飽和運算方法把溢出情況的結(jié)果設(shè)置為預先設(shè)置的值。

    正溢出就設(shè)置為最大值,負溢出就設(shè)置為最小值,數(shù)學角度沒有意義。主要是應(yīng)用于執(zhí)行圖像計算顯示圖片,正溢出就是最大值為白色,負溢出就是最小值為黑色。

    操作的指令有如下:

    MMX加法示例

    兩個long類型整數(shù)值存儲到單一內(nèi)存位置,創(chuàng)建打包雙字整數(shù)值。移動到MMX寄存器,然后通過PADD指令相加,存放到MM0中,最后復制到result內(nèi)存位置。

    .section .data value1:.int 10, 20 value2:.int 30, 40 .section .bss.lcomm result, 8 .section .text .globl _start _start:nopmovq value1, %mm0movq value2, %mm1paddd %mm1, %mm0movq %mm0, resultmovl $60, %eaxmovl $0, %ebxsyscall

    編譯:

    as -g -o mmxadd.o mmxadd.s

    ld -o mmxadd mmxadd.o

    使用gdb調(diào)試,在退出前斷點進行查看結(jié)果。

    (gdb) x /2d &value1

    0x6000d8:?? 10? 20

    (gdb) x /2d &value2

    0x6000e0:?? 30? 40

    (gdb) x /2x &result

    0x6000e8 <result>: 0x00000028? 0x0000003c

    gdb>info all

    st0??????????? <invalid float value>?? (raw 0xffff0000003c00000028)

    可以在st0寄存器中看到兩個結(jié)果。MM0就是存在st0中的。

    ?

  • MMX乘法示例
  • 乘法比較困難,因為乘法生產(chǎn)的結(jié)果可能會比輸入操作數(shù)大得多。乘法允許使用兩條指令完成乘法操作。

    PMULL把每對打包字整數(shù)值相乘,結(jié)果的低16位存放到目標寄存器。

    PMULH把每對打包字整數(shù)值相乘,結(jié)果的高16位存放到目標寄存器。

    帶符號的是PMULLW和PMULHW,無符號的是PMULLUW和PMULHUW。

    ???? 乘法系列中還有一個附加指令是PMADDWD指令。

    MMX邏輯和移位

    MMX中可用的布爾邏輯指令如下圖:

    SOURCE可以是MMX寄存器或者64位的內(nèi)存位置,目標必須是MMX寄存器。

    ?

    MMX比較

    兩個值比較指令如下圖:

    比較結(jié)果存放到目標打包整數(shù)值中。

  • 示例
  • 比較的示例如下,value1和value2被設(shè)置為保存4個short類型的整數(shù)值。加載到MMX寄存器中,然后使用PCMPEQW指令比較打包整數(shù)值的4個字值。結(jié)果存放到MM0寄存器,然后傳送到result中。

    .section .data value1:.short 10, 20, -30, 40 value2:.short 10, 40, -30, 45 .section .bss.lcomm result, 8 .section .text .globl _start _start:nopmovq value1, %mm0movq value2, %mm1pcmpeqw %mm1, %mm0movq %mm0, resultmovl $60, %eaxmovl $0, %ebxsyscall

    as -g -o mmxcomp.o mmxcomp.s

    ld -g -o mmxcomp mmxcomp.o

    使用gdb進行調(diào)試,開始時如下;

    (gdb) x /x &value1

    0x6000d8:?? 0x0014000a

    (gdb) x /x &value2

    0x6000e0:?? 0x0028000a

    (gdb) x /x &result

    0x6000e8 <result>: 0x00000000

    執(zhí)行移動到MM0/MM1后,ST0/ST1的寄存器如下:

    st0 <invalid float value>? (raw 0xffff0028ffe20014000a)

    st1 <invalid float value>? (raw 0xffff002dffe20028000a)

    執(zhí)行pcmpeqw后st0寄存器如下:

    st0 <invalid float value>? (raw 0xffff0000ffff0000ffff)

    (gdb) x /8x & result

    0x6000e8 <result>: 0x0000ffff? 0x0000ffff

    我們發(fā)現(xiàn)結(jié)果如下:

    相等的打包整數(shù)值,結(jié)果相等等于FFFF,不相等的等于0000。

    總結(jié)

    以上是生活随笔為你收集整理的第41部分-Linux x86 64位汇编MMX使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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