第41部分-Linux x86 64位汇编MMX使用
第41部分-Linux x86 64位匯編MMX使用
使用MMX架構需要一下步驟
加載和獲得打包的整數值,使用movq指令把整數值傳送進/出MMX寄存器。
對比打包整數值操作,同時計算多個結果值,單一一組標志不能表示操作的結果。可以從執行數學操作的3種溢出方法中選擇: 環繞/帶符號飽和/無符號飽和。
帶符號和無符號飽和運算方法把溢出情況的結果設置為預先設置的值。
正溢出就設置為最大值,負溢出就設置為最小值,數學角度沒有意義。主要是應用于執行圖像計算顯示圖片,正溢出就是最大值為白色,負溢出就是最小值為黑色。
操作的指令有如下:
MMX加法示例
兩個long類型整數值存儲到單一內存位置,創建打包雙字整數值。移動到MMX寄存器,然后通過PADD指令相加,存放到MM0中,最后復制到result內存位置。
.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調試,在退出前斷點進行查看結果。
(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寄存器中看到兩個結果。MM0就是存在st0中的。
?
乘法比較困難,因為乘法生產的結果可能會比輸入操作數大得多。乘法允許使用兩條指令完成乘法操作。
PMULL把每對打包字整數值相乘,結果的低16位存放到目標寄存器。
PMULH把每對打包字整數值相乘,結果的高16位存放到目標寄存器。
帶符號的是PMULLW和PMULHW,無符號的是PMULLUW和PMULHUW。
???? 乘法系列中還有一個附加指令是PMADDWD指令。
MMX邏輯和移位
MMX中可用的布爾邏輯指令如下圖:
SOURCE可以是MMX寄存器或者64位的內存位置,目標必須是MMX寄存器。
?
MMX比較
兩個值比較指令如下圖:
比較結果存放到目標打包整數值中。
比較的示例如下,value1和value2被設置為保存4個short類型的整數值。加載到MMX寄存器中,然后使用PCMPEQW指令比較打包整數值的4個字值。結果存放到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, %ebxsyscallas -g -o mmxcomp.o mmxcomp.s
ld -g -o mmxcomp mmxcomp.o
使用gdb進行調試,開始時如下;
(gdb) x /x &value1
0x6000d8:?? 0x0014000a
(gdb) x /x &value2
0x6000e0:?? 0x0028000a
(gdb) x /x &result
0x6000e8 <result>: 0x00000000
執行移動到MM0/MM1后,ST0/ST1的寄存器如下:
st0 <invalid float value>? (raw 0xffff0028ffe20014000a)
st1 <invalid float value>? (raw 0xffff002dffe20028000a)
執行pcmpeqw后st0寄存器如下:
st0 <invalid float value>? (raw 0xffff0000ffff0000ffff)
(gdb) x /8x & result
0x6000e8 <result>: 0x0000ffff? 0x0000ffff
我們發現結果如下:
相等的打包整數值,結果相等等于FFFF,不相等的等于0000。
總結
以上是生活随笔為你收集整理的第41部分-Linux x86 64位汇编MMX使用的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MMX和SSE的运用
- 下一篇: MMX和SSE
