ホームに戻る
 エンディアンを考える

;
;   アセンブラ
;

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};

となります。

inserted by FC2 system