MMX指令集在C 中的使用

2021-04-15 00:55:02 字數 4267 閱讀 5461

一、 內聯彙編的一般原則:

1、 自由使用通用暫存器;(eax,ebx,ecx和edx)

2、 其它暫存器利用堆疊保留,使用,最後恢復;

一般的像下面這樣:__a**二、 內聯彙編__a**可以單獨使用:

例如:__a** mov eax,anyval1

__a** mov ebx,anyval2三、 函式返回值可以直接放到eax中,可以不理會警告

例如:int anyfun(……/*anyparm*/)

四、 內聯彙編不區分大小寫,語法同普通彙編

五、 內聯彙編盡量使用__a**或_a**關鍵字,而不用標準c++的a**關鍵字(這個是微軟說的)

1、 mmx指令集簡介:

[資料傳輸指令]

movq //傳輸64位整數

movd //傳輸32位整數

[資料打包轉換指令]

packsswb //pack words into bytes with signed saturation.

packssdw //pack doublewords into words with signed saturation.

packuswb //pack words into bytes with unsigned saturation.

punpckhbw //unpack high-order bytes.

punpckhwd //unpack high-order words.

punpckhdq //unpack high-order doublewords.

punpcklbw //unpack low-order bytes.

punpcklwd //unpack low-order words.

punpckldq //unpack low-order doublewords.

注:這一組指令我沒有具體用過,不知道是幹什麼的,請高手賜教!小弟先謝了!

[ 算術指令]

paddb

paddw

paddd

paddsb

paddsw

paddusb

paddusw

psubb

psubw

psubd

psubsb

psubsw

psubusb

psubusw

pmulhw

pmullw

pmaddwd

[ 比較指令]

pcmpeqb compare packed bytes for equal.

pcmpeqw compare packed words for equal.

pcmpeqd compare packed doublewords for equal.

pcmpgtb compare packed signed byte integers for greater than.

pcmpgtw compare packed signed word integers for greater than.

pcmpgtd compare packed signed doubleword integers for greater than.

這組指令用於成組比較資料

[ 位邏輯指令]

pand bitwise logical and.

pandn bitwise logical and not.

por bitwise logical or.

pxor bitwise logical exclusive or.

這組指令與and,xor基本相同,都是按位進行邏輯運算。

[ 移位和迴圈移位指令]

psllw //shift packed words left logical.

pslld //shift packed doublewords left logical.

psllq //shift packed quadword left logical.

psrlw //shift packed words right logical.

psrld //shift packed doublewords right logical.

psrlq //shift packed quadword right logical.

psraw //shift packed words right arithmetic.

psrad //shift packed doublewords right arithmetic.

[ 狀態管理指令]

emms //empty mmx state.

在vc中要求所有的mmx指令呼叫完畢後都要呼叫這個指令清空

例如:__a**以上是所有的mmx指令,你可以測試使用其中的指令,他的工作原理就是單指令,多資料

2、 使用mmx指令集的注意事項

由於在cpu內部,fpu暫存器和mmx暫存器是同一組暫存器,所以在同時引用上面暫存器時要注意正確的狀態轉換,具體做法以後在**。你只要先記住不能簡單的混合以上兩種指令集即可。

每次呼叫之前要先檢測cpu是否支援mmx指令集,以免發生異常。具體做法看下列示例:

mov eax, 1 ; request for feature flags

cpuid ; 0fh, 0a2h cpuid instruction

test edx, 00800000h ; is ia mmx technology bit (bit 23 of edx)

; in feature flags set?

jnz mmx_technology_found這段**來自intel的參考手冊,所以你可以放心的使用。

3、 下面用一段示例**來說明一下怎樣用mmx指令__int8  i8_a[2][16];    //位元組運算元,兩組,每組16個

__int16 i16_a[8];      //字運算元

__int32 i32_a[4];

__int64 i64_a[2];

i64_a[0]=0;

i64_a[1]=0;

i32_a[0]=1000;

i32_a[1]=1000;

i32_a[2]=3;

i32_a[3]=4;

i16_a[0]=10;

i16_a[1]=20;

i16_a[2]=30;

i16_a[3]=40;

i16_a[4]=50;

i16_a[5]=60;

i16_a[6]=70;

i16_a[7]=80;

i8_a[0][0]=1;

i8_a[0][1]=1;

i8_a[0][2]=1;

i8_a[0][3]=1;

i8_a[0][4]=1;

i8_a[0][5]=1;

i8_a[0][6]=1;

i8_a[0][7]=1;

i8_a[0][8]=1;

i8_a[0][9]=1;

i8_a[0][10]=1;

i8_a[0][11]=1;

i8_a[0][12]=1;

i8_a[0][13]=1;

i8_a[0][14]=1;

i8_a[0][15]=1;

i8_a[1][0]=2;

i8_a[1][1]=2;

i8_a[1][2]=2;

i8_a[1][3]=2;

i8_a[1][4]=2;

i8_a[1][5]=2;

i8_a[1][6]=2;

i8_a[1][7]=2;

i8_a[1][8]=2;

i8_a[1][9]=2;

i8_a[1][10]=2;

i8_a[1][11]=2;

i8_a[1][12]=2;

i8_a[1][13]=2;

i8_a[1][14]=2;

i8_a[1][15]=2;

__a**

你可以通過設定斷點,和watch的方法來觀察暫存器以及變數的變化情況,這裡只是引用了一部分的指令,那麼最引人注意的是對i16_a、i8_a、以及i32_a陣列的操作,我是隨便對他們進行了算術運算,大家可以看到我加兩組位元組陣列資料時只用了兩條加指令,這是普通的指令集望塵莫及的。這就是單指令,多資料的魅力。同時你也可以看到對64位整數的操作也簡單多了。但是要注意的是,mmx指令集裡好像沒有提供除法操作。所以你需借助演算法來實現。另外要補充的是mmx暫存器是從mm0-mm7命名的一組64位暫存器。

MMX指令集(詳解)

emms mmx狀態置空 將fp特徵字置空 全1 使後續浮點指令可以使用浮點暫存器,其他mmx指令自動置fp為全0.本指令應在所有mmx例程結束和呼叫可含有fp指令的例程時使用,以清除mmx狀態.movd mm,r m32 movd r m32,mm 轉移32位資料 將32位資料從整型暫存器 記憶體...

基於MMX指令集的程式設計簡介

基於mmx指令集的程式設計簡介 出處 http www.codeproject.com cpp mmxintro.asp mmx技術簡介 intel 公司的mmx 多 增強指令集 技術可以大大提高應用程式對二維三維圖形和圖象的處理能力。intel mmx技術可用於對大量資料和複雜陣列進行的複雜處理,...

基於MMX指令集的程式設計簡介

mmx技術簡介 intel 公司的mmx 多 增強指令集 技術可以大大提高應用程式對二維三維圖形和圖象的處理能力。intel mmx技術可用於對大量資料和複雜陣列進行的複雜處理,使用mmx技術可處理的資料基本單位可以是位元組 byte 字 word 或者是雙字 double word visual ...