Endianness (日本語)

HistoryEdit

多くの歴史的および現存するプロセッサは、排他的または設計オプションとして、ビッグエンディアンメモリ表現を使用します。 ビッグエンディアンメモリー表現になっていて、一般的にネットワーク、あるいはインターネットプロトコルのスイートルーム。 他のプロセッサタイプはリトルエンディアンのメモリ表現を使用し、”ミドルエンディアン”、”ミックスエンディアン”、”PDP-11-エンディアン”と呼ばれる別のスキームを使用する。

IBM System/360は、後継のSystem/370、ESA/390、およびz/Architectureと同様に、ビッグエンディアンのバイトオーダーを使用します。, PDP-10はまた、バイト指向の命令にビッグエンディアンアドレッシングを使用します。 IBM Series/1ミニコンピュータでもビッグエンディアンのバイトオーダーを使用している。

異なるエンディアンのデータを扱うことは、NUXI問題と呼ばれることがあります。 この用語は、混合エンディアンPDP-11上で実行されたUNIXをビッグエンディアンIBM Series/1コンピュータに適応させる際に遭遇するバイト順の競合を暗示している。 Unixのシステムを同じコードを作成マルチプラットフォームで異なる内部表現に変換するものである。, 変換された最初のプログラムの一つは、Unixを印刷することになっていましたが、シリーズ/1では、代わりにnUxi

Datapoint2200は、キャリー伝播を容易にするために、リトルエンディアンを備えた単純なビットシリアルロジックを使用します。 IntelがDatapoint用の8008マイクロプロセッサを開発したとき、互換性のためにリトルエンディアンを使用しました。, しかし、インテルは8008を間に合わせることができなかったため、Datapointはmcs-48と8086とそのx86後継機を含むほとんどのIntel設計ではリトルエンディアンネスが保持されていた。 DEC Alpha、Atmel AVR、VAX、MOS Technology6502ファミリ(Western Design Center65802および65C816を含む)、Zilog Z80(Z180およびeZ80を含む)、Altera Nios II、および他の多くのプロセッサおよびプロセッサファミリもリトルエ

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

Intel8051は、他のIntelプロセッサとは異なり、ljmpおよびLCALLの16ビットアドレスをビッグエンディアン形式で期待していますが、xCALL命令はリターンアドレスをリトルエンディアン形式でスタックに格納します。

SPARCは歴史的にバイエンディアンであるバージョン9までビッグエンディアンを使用していましたが、同様に初期のIBM POWERプロセッサはビッグエンディアンでしたが、PowerPCとPower ISAの子孫はバイエンディアンです。 アームアーキテクチャールエンディアンのバージョン3になった際bi-エンディアンです。※,

現在のアーキテクチャ編集

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

一部の命令の構築を走るソフトウェアのいずれかendiannessは、bi-エンディアンです。 これには、ARM AArch64、C-Sky、Power ISA、およびRISC-Vが含まれます。,

ビッグエンディアンアーキテクチャのみには、IBM z/アーキテクチャ、フリースケールコールドファイア(モトローラ68000シリーズベース)、Atmel AVR32、OpenRISCが含まれる。 バイエンディアンPower上のIBM AIXおよびOracle Solarisオペレーティング-システムISAおよびSPARCはビッグエンディアン-モードで動作し、Linux on Powerの一部のディストリビューショ,

Bi-endiannessEdit

一部のアーキテクチャ(ARMバージョン3以上、PowerPC、Alpha、SPARC V9、MIPS、PA-RISC、SuperH SH-4およびIA-64を含む)は、データフェッチおよびストア、命令フェッチ、またはその両方で切り替え可能なエンディアンを可能にする設定を備えています。 この機能はパフォーマンスを向上させるまたは簡素化の論理ネットワーク機器やソフトウェアです。 バイエンディアンという言葉は、ハードウェアについて言うとき、エンディアン形式でデータを計算または渡すマシンの機能を示します。,しかし、一部のシステムでは、デフォルトのエンディアンはマザーボード上のハードウェアによって選択され、ソフトウェアで変更することはできません(例えば、Cray T3E上のビッグエンディアンモードでのみ実行されるAlpha)。

“bi-endian”という用語は、主にプロセッサがデータアクセスをどのように扱うかを指すことに注意してください。, データアクセスが完全にバイエンディアンであっても、与えられたプロセッサ上の命令アクセス(命令ワードのフェッチ)は固定エンディアンを前提とすることがあるが、IntelのIA-64ベースのItanium CPUのように、これは必ずしもそうではない。

注意もある名目的にはbi-エンディアンのCpuを必要とマザーボードに完全にスイッチendianness., たとえば、リトルエンディアンモードの32ビットデスクトップ指向PowerPCプロセッサは、実行プログラムの観点からはリトルエンディアンとして機能しますが、マザーボードは64ビットスワップを8バイトレーンすべてにわたって実行し、リトルエンディアンビューがI/Oデバイスに適用されるようにする必要があります。 この異常なマザーボードハードウェアがない場合、デバイスドライバソフトウェアは、不完全な変換を元に戻すために異なるアドレスに書き込む必要があ,

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

1990年代後半以降のSPARCプロセッサ(“SPARC v9″準拠プロセッサ)では、メモリからロードまたはメモリに格納する個々の命令ごとにデータエンディアンネスを選択できるようになっています。

ARMアーキテクチャは、BE-8とBE-32と呼ばれる二つのビッグエンディアンモードをサポートしています。 ARMv5までのcpuは、BE-32またはワード不変モードのみをサポートします。, ここでは、自然に整列された32ビットアクセスはリトルエンディアンモードのように機能しますが、バイトまたは16ビットワードへのアクセスは対応するアドレスにリダイレクトされ、整列されていない ARMv6ではBE-8またはByte-Invariantモードが導入されており、シングルバイトへのアクセスはリトルエンディアンモードと同様に機能しますが、16ビット、32ビット、または(ARMv8以降)64ビットワードにアクセスすると、データのバイトスワップが発生します。 この簡素化unalignedメモリアクセスなどのメモリマップドへのアクセスレジスタ以外の32ビット.,

多くのプロセッサは、レジスタ内のワードを反対のエンディアンに変換する命令を持っています、つまり、16ビット、32ビット、または64ビットのワードのバイトの順序を入れ替えます。 ただし、個々のビットはすべて逆になりません。

最近のIntel x86およびx86-64アーキテクチャCpuには、MOVBE命令(第4世代以降のIntel Core、Atomの後)があり、メモリからビッグエンディアン形式のワードをフェッチしたり、ビッグエンディアン形式のワードをメモリに書き込んだりする。 これらのプロセッサは、その徹底のどちらのエンディアンです。※, また、”間違った”エンディアンにあったメモリ位置からワードがすでにフェッチされている場合など、レジスタの内容のバイト順序を逆にするためのスワップ命令の範囲も既に持っていました。

Floating pointEdit

今日のユビキタスx86プロセッサはすべてのタイプのデータ(整数、浮動小数点)にリトルエンディアンストレージを使用していますが、浮動小数点数はビッグエンディアン形式で表され、整数はリトルエンディアン形式で表されるハードウェアアーキテクチャはいくつかあります。, 倍精度数の半分のリトルエンディアン、半分のビッグエンディアン浮動小数点表現を持つARMプロセッサがあります:両方の32ビットワードは整数レジスタのようにリトルエンディアンに格納されますが、最も重要なものは最初に格納されます。 “ネットワーク”標準表現を持たない浮動小数点形式は多く存在しているため、XDR標準ではビッグエンディアンIEEE754を表現として使用しています。 したがって、広範なIEEE754浮動小数点標準がエンディアンネスを指定していないことは奇妙に見えるかもしれません。, 理論的には、これも標準IEEE浮動小数点データの記述による一台の機械が読めるようです。 しかし、現代の標準コンピュータ(つまり、IEEE754を実装している)では、実際には浮動小数点数のエンディアンネスが整数のエンディアンネスと同じであると仮定しても安全であり、データ型に関係なく変換を簡単にすることができる。 (ただし、特殊な浮動小数点形式を使用する小規模な組み込みシステムは別の問題かもしれません。,)

可変長dataEdit

これまで考えられていたほとんどの命令には、操作コード内のオペランドのサイズ(長さ)が含まれています。 頻繁に使用できるオペランドの長さは、1、2、4、8、または16バイトです。しかし、オペランドの長さを命令の別のフィールドまたはオペランド自体と一緒に保持することができるアーキテクチャもあります。 このようなアプローチできるオペランド長さは最大256バイトのファイルのメモリサイズです。このようなオペランドのデータ型は、文字列またはBCDです。,

OptimizationEdit

リトルエンディアンシステムは、異なるアドレスを使用することなく、同じ値を異なる長さのメモリから読み取ることができるという性質を持っています(アライメント制限が課されている場合でも)。 たとえば、コンテンツ4A00 00 00を持つ32ビットのメモリ位置は、8ビット(value=4A)、16ビット(004A)、24ビット(00004A)、または32ビット(0000004A)のいずれかと同じアドレスで読み取ることができ、これらはすべて同じ数値を保持します。, このリトルエンディアンプロパティは、高レベルのプログラマによって直接使用されることはめったにありませんが、コードオプティマイザやアセン

より具体的に言えば、このような最適化は、ほとんどのリトルエンディアンシステムでtrueを返す次のCコードと同等です。

union { uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64;} u = { .u64 = 0x4A };puts(u.u8 == u.u16 && u.u8 == u.u32 && u.u8 == u.u64 ? "true" : "false");

C++では許可されていませんが、このような型パンニングコードはC11標準では”実装定義”として許可されており、ハードウェアと対話するコードで一般的に使用されています。,

一方、状況によっては、完全な表現ではなく、その最も重要な部分のみを読み取ることによって、マルチバイトまたはマルチワード値の近似値を得ることが有用であるかもしれません。

この種の最適化は、異なるエンディアンのシステム間で移植可能ではありません。

計算順序編集

位置数システムにおける一部の演算は、基本ステップが実行される自然または好ましい順序を持っています。,この場合の影響に関するパフォーマンスの小規模バイトの連想プロセッサとマイコン.

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

最下位桁編集で始まる操作

学校で学んだように、加算、減算、乗算は最下位桁の位置で始まり、後続のより重要な位置にキャリーを伝播します。,最初の(=最小のアドレス)バイトで複数桁のデータをアドレス指定することが、支配的なアドレス指定方式です。この最初のバイトに最下位桁が含まれている場合、これはリトルエンディアンと同等であり、これらの操作の実装はわずかに簡単です。

最上位の桁から始まる操作edit

比較と除算は最上位の桁から始まり、可能なキャリーを後続の下位の桁に伝播します。, 固定長の数値(通常は長さ1,2,4,8,16)の場合、これらの操作の実装はビッグエンディアンマシンではわずかに簡単です。

可変長のオペランド編集

プログラミング言語Cでは、文字列の辞書編集的比較はサブルーチンによって行われなければならず、これはしばしばサブルーチン(例えばstrcmp)として提供され実装される。

多くのビッグエンディアンプロセッサには、可変長の文字列を辞書的に比較するためのハードウェア命令が含まれています(例えば、IBM System/360およびその後継,

impactEditなしの操作

代入文による通常のデータ転送は、原則としてプロセッサのエンディアンから独立しています。

Middle-endianEdit

一般的にmiddle-endianまたはmixed-endianと呼ばれる他の多くの順序付けが可能です。 コンピュータサイエンス以外のそのような例の一つは、月/日/年の標準的なアメリカの日付の書式です。

PDP-endianEdit

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

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

Storage of a 32-bit integer, 0x0A0B0C0D, on a PDP-11
increasing addresses →
0Bh 0Ah 0Dh 0Ch
0A0Bh 0C0Dh …,

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

Honeywellシリーズ16Edit

Honeywellシリーズ16 16ビットコンピュータは、Honeywell316を含め、PDP-11の反対であり、32ビットワードをCに格納します。, It stores each 16-bit word in big-endian order, but joins them together in little-endian manner:

storage of a 32-bit integer, 0x0A0B0C0D, on a Honeywell 316
increasing addresses →
0Ch 0Dh 0Ah 0Bh
…, 0C0Dh 0A0Bh

Intel IA-32 segment descriptorsEdit

Segment descriptors of IA-32 and compatible processors keep a 32-bit base address of the segment stored in little-endian order, but in four nonconsecutive bytes, at relative positions 2, 3, 4 and 7 of the descriptor start.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です