エンディアン

HistoryEdit

多くの歴史的および現存のプロセッサは、排他的または設計オプションとしてビッグエンディアンのメモリ表現を使っています。 ビッグエンディアン・メモリ表現は、一般にネットワーク・オーダーと呼ばれ、インターネット・プロトコル・スイートで使用されています。 他のプロセッサはリトルエンディアン・メモリ表現を使用し、さらに「ミドルエンディアン」、「ミックスエンディアン」、「PDP-11 エンディアン」と呼ばれる別のスキームを使用しています。 PDP-10 もバイト指向の命令ではビッグエンディアン・アドレッシングを採用しています。 IBM Series/1 ミニコンピュータもビッグエンディアンバイトオーダーを使用している。

異なるエンディアンのデータを扱うことは、NUXI問題と呼ばれることもある。 この用語は、ミックスエンディアンの PDP-11 上で動作する UNIX をビッグエンディアンの IBM Series/1 コンピュータに適合させる際に遭遇したバイト順序の衝突を暗示しています。 Unix は、異なる内部表現を持つプラットフォーム用に同じコードをコンパイルできるようにした最初のシステムの 1 つです。 変換された最初のプログラムのひとつは Unix と出力することになっていましたが、 Series/1 では代わりに nUxi と出力されました。

Datapoint 2200 はキャリー伝搬を容易にするためリトルエンディアンで単純なビットシリアルロジックを使用しています。 Intel が Datapoint 用に 8008 マイクロプロセッサを開発したとき、互換性を保つためにリトルエンディアンを使用しました。 しかし、インテルが8008の納入に間に合わなかったため、データポイントは中規模集積に相当するものを使用したが、MCS-48や8086とそのx86後継を含むほとんどのインテル設計でリトルエンディアンが維持された。 DEC Alpha、Atmel AVR、VAX、MOS Technology 6502 ファミリー (Western Design Center 65802 と 65C816 を含む)、Zilog Z80 (Z180 と eZ80 を含む)、Altera Nios II、その他多くのプロセッサとプロセッサファミリーもリトルエンディアンです。

Motorola 6800 / 6801、6809、68000 シリーズのプロセッサはビッグエンディアン形式を使用しています。

Intel 8051 は、他の Intel プロセッサとは異なり、ビッグエンディアンの LJMP と LCALL に対して 16 ビットアドレスを期待しますが、xCALL 命令はリトルエンディアンでスタックにリターンアドレスを格納します。 ARMアーキテクチャは、バイエンディアンになったバージョン3以前はリトルエンディアンでした。

Current ArchitecturesEdit

Intel x86およびAMD64 / x86-64シリーズのプロセッサは、リトルエンディアン形式を使用しています。 この慣習に従ってリトルエンディアン・モードのみを許可する他の命令セット・アーキテクチャには、Nios II、Andes Technology NDS32、および Qualcomm Hexagon があります。

一部の命令セット・アーキテクチャでは、バイ・エンディアン・アーキテクチャ上でどちらのエンディアンでもソフトウェアを実行できます。 これには、ARM AArch64、C-Sky、Power ISA、および RISC-V が含まれます。

単独でビッグエンディアンのアーキテクチャには、IBM z/Architecture、Freescale ColdFire (Motorola 68000 シリーズベース)、Atmel AVR32、および OpenRISC があります。 バイエンディアンのPower ISAとSPARC上のIBM AIXとOracle Solarisオペレーティングシステムはビッグエンディアン・モードで実行されます。

バイエンディアン編集

一部のアーキテクチャ (ARM バージョン 3 以上、PowerPC、Alpha、SPARC V9、MIPS、PA-RISC、SuperH SH-4 および IA-64) では、データ フェッチおよびストア、命令フェッチ、またはその両方でエンディアンを切り替えられる設定が用意されています。 この機能により、ネットワーク機器やソフトウェアの性能を向上させたり、ロジックを簡素化したりすることができます。 これらのアーキテクチャの多くは、ソフトウェアによって特定のエンディアン形式に切り替えることができます (通常、コンピュータの起動時に行われます)。2383>

バイエンディアンという用語は、主にプロセッサがデータ アクセスをどのように処理するかに言及していることに注意してください。 データ アクセスが完全にバイ・エンディアンであっても、特定のプロセッサ上の命令アクセス (命令ワードのフェッチ) は、固定エンディアンを仮定することがありますが、これは常にそうであるとは限りません。 たとえば、リトル エンディアン モードでの 32 ビット デスクトップ向け PowerPC プロセッサは、実行中のプログラムの観点からはリトル エンディアンとして動作しますが、リトル エンディアンのビューが I/O デバイスに適用されるように、マザーボードがすべての 8 バイト レーンで 64 ビット スワップを実行することを必要とします。 この珍しいマザーボード ハードウェアがない場合、デバイス ドライバー ソフトウェアは、不完全な変換を元に戻すために異なるアドレスに書き込み、さらに通常のバイト スワップを実行しなければなりません。

組み込み用の多くの PowerPC プロセッサやほぼすべての SPARC プロセッサなどの一部の CPU では、ページごとにエンディアンを選択できます。

多くのプロセッサは、レジスタ内のワードを逆のエンディアンに変換する命令を持っています。

最近の Intel x86 および x86-64 アーキテクチャーの CPU には、ビッグエンディアン形式のワードをメモリーからフェッチするか、ビッグエンディアン形式のワードをメモリーに書き込む MOVBE 命令 (Intel Core は Atom 以降、第4世代) が搭載されています。 これらのプロセッサは、それ以外は徹底的にリトルエンディアンである。 また、「間違った」エンディアンのメモリ位置からワードをフェッチした場合など、レジスタの内容のバイト順を逆転させるスワップ命令もすでに用意されていました。

浮動小数点演算

今日のユビキタス x86 プロセッサはすべてのタイプのデータ (整数、浮動小数点) に対してリトルエンディアンのストレージを使用しますが、浮動小数点数がビッグエンディアンで表され、整数がリトルエンディアンで表されるハードウェアアーキテクチャが多数存在します。 ARMプロセッサには、倍精度の浮動小数点数をハーフリトルエンディアンとハーフビッグエンディアンで表現するものがあります。32ビットワードは両方とも整数レジスタのようにリトルエンディアンで格納されますが、最上位のものが先に格納されます。 これまで多くの浮動小数点フォーマットで「ネットワーク」標準の表現がなかったため、XDR規格ではビッグエンディアンのIEEE754を表現として使用しています。 そのため、広く普及しているIEEE754浮動小数点規格がエンディアンを指定していないのは不思議に思われるかもしれません。 理論的には、あるマシンで書かれた標準的なIEEE浮動小数点データでさえ、別のマシンでは読めない可能性があることを意味します。 しかし、最近の標準的なコンピュータ(IEEE754を実装している)では、実際には浮動小数点数のエンディアンは整数の場合と同じであると仮定して問題ないため、データ型に関係なく簡単に変換することができます。 (

可変長データ編集

これまでに検討したほとんどの命令は、オペランドのサイズ(長さ)を演算コード内に含んでいる。 しかし、オペランドの長さが命令の別のフィールドに、またはワードマークなどによってオペランド自体に保持されるアーキテクチャもある。 このようなアプローチでは、オペランドの長さを256バイトまで、あるいはメモリサイズいっぱいにすることができます。このようなオペランドのデータ型は文字列またはBCDです。 IBM 1401, 1410, 1620, System/3×0, ESA/390, z/Architecture, これらはすべてビッグエンディアン型である。

OptimizationEdit

リトルエンディアン方式は、(アライメント制限がかかっていても)異なるアドレスを使用せずにメモリから同じ値の長さを読み出せる性質を持っている。 例えば、4A 00 00 00という内容の32ビットメモリ位置は、同じアドレスで8ビット(値=4A)、16ビット(004A)、24ビット(00004A)、32ビット(0000004A)のいずれでも同じ数値が読み取れるのです。 より具体的には、このような最適化は、ほとんどのリトル エンディアン システムで次の C コードが真を返すのと同等です。

この種の最適化は、異なるエンディアンのシステム間で移植性がない。

Calculation orderEdit

位置数システムのいくつかの操作は、基本ステップが実行される自然または望ましい順序を持っています。この順序は、小規模なバイト アドレス プロセッサやマイクロコントローラでのパフォーマンスに影響を与える可能性があります。

しかし、高性能プロセッサは通常、1 バイトをフェッチするのと同じ時間でメモリから典型的なマルチバイト オペランドをフェッチするので、ハードウェアの複雑性はバイト順序によって影響を受けません。

最下位桁から始まる演算編集

加算、減算、乗算は最下位桁の位置から始まり、キャリーが後続の上位の位置に伝搬される。この最初のバイトが最下位桁を含む場合、これはリトルエンディアンに相当し、これらの操作の実装はわずかに単純化されます。 2383>

Operands of varying lengthEdit

Many big-endian processors contains hardware instructions for lexicographically comparing varying length character strings (e.g., Inc.).

影響のない演算 編集

代入文による通常のデータ転送は、原則としてプロセッサのエンディアンに依存しない。

ミドルエンディアン 編集

一般にミドルエンディアンまたはミックスエンディアンと呼ばれる、多数の他の順序が可能である。 コンピュータサイエンス以外の例としては、月/日/年というアメリカの標準的な日付書式がある。

PDP-endianEdit

PDP-11は原則として16ビットリトルエンディアンシステムである。 PDP-11/45, PDP-11/70 およびそれ以降のプロセッサのオプションの浮動小数点プロセッサでは、浮動小数点値と整数値を変換する命令は、32 ビットの「倍精度整数 long」値を格納し、16 ビット半分を期待されるリトルエンディアンの順序からスワップして格納していたのです。 UNIX の C コンパイラも 32 ビット長整数に対して同じフォー マットを使っていました。 この順序は PDP-エンディアンと呼ばれています。

このエンディアンを解釈する方法は、32 ビット整数をビッグエンディアンで 2 つの 16 ビットワードとして格納するが、ワード自体はリトルエンディアンであることです (E.g. “jag cog sin” would be “gaj goc nis”):

32ビット整数0x0A0B0C0DをPDP-11
増設アドレス →
・・・で保存する場合。 0Bh 0Ah 0Dh 0Ch
0A0Bh 0C0Dh …・・・・・・ 0Bh 0Ah

ここでいう16ビット値とは、実際のレイアウトではなく、数値のことを指します。

Honeywell Series 16Edit

Honeywell316を含むHoneywell Series 16の16ビットコンピュータは、PDP-11とは逆に32ビットワードをCで格納する。 各16ビットワードをビッグエンディアンで格納するが、リトルエンディアンで結合する:

32ビット整数、0x0A0B0C0Dの格納 Honeywell 316
増えるアドレス →
…. 0Ch 0Dh 0Ah 0Bh
…となる。. 0C0Dh 0A0Bh ….

Intel IA-32 segment descriptorsEdit

IA-32および互換プロセッサのセグメント記述子は、32ビットベースアドレスを、記述子開始の相対位置2、3、4、7にリトルエンディアン順に、ただし連続しない4バイトで保存する。