ホームに戻る
エンディアンを考える
;
; アセンブラ
;
segment .code USE32
global _mmx
_mmx:
push ebp
mov ebp, esp
mov edx, dword [ebp+8]
movq mm0, [edx]
psrlq mm0, 1 ; 右へ1ビットシフト
movq [edx], mm0
emms
leave
ret
__end__mmx
/*
* C言語
*/
#include <stdio.h>
extern void mmx(short *buf);
int main()
{
int i;
short a[4] = {3, 0, 0, 0};
char *pch;
short buf1[4 + 4];
short *pbuf1 = (short *)(((unsigned)buf1 + 7) & ~7);
for(i = 0; i < 4; i++){
pbuf1[i] = a[i];
}
mmx(pbuf1);
pch = (char *)pbuf1;
for(i = 0; i < 8; i++){
printf("%d, ", pch[i]);
}
getchar();
return 0;
}
このプログラムについて
エンディアンがどうなっているか検証します。
検証する環境はリトルエンディアン。
まず short a[4] = {3, 0, 0, 0}; ですがメモリ上に取り込むと、
03, 00, 00, 00, 00, 00, 00, 00
short のサイズが2バイトなのでこうなります。
次に mm0 レジスタに読みこみます。
00, 00, 00, 00, 00, 00, 00, 03
このとき8バイトが左右対称に入れ替わります。
サンプルコードでは右へ1ビットシフトしているので、
00, 00, 00, 00, 00, 00, 00, 01
となります。
これを mm0 からメモリに戻すと再び入れ替わり、
01, 00, 00, 00, 00, 00, 00, 00
となります。
よって、最終的な結果は,
a[4] = {1, 0, 0, 0};
となります。