(Last modified: )

リトルエンディアンのメリットを考える

リトルエンディアンのメリットを自分なりに考えた記事です。

x86において、データに何らかの演算をする場合、必ずレジスタを経由する必要があります。例えば、ADD命令の場合、どちらかのオペランドはレジスタです。 しかし、レジスタのサイズは32bitであれば4バイト、64bitであれば8バイトです。したがって、画像や動画のような大きなデータは、メモリ上に置かれます。

前述したように、レジスタのサイズは4〜8バイトなため、メモリ上の何MiBもあるデータを一気に読み込ませることはできません。 1バイトごと読み込んだり、あるいはUTF-16のように2バイトごと読み込むこととなります。それを、終端1までループすることでしょう。

このことから、そのアドレスから何バイト読み込む必要があるのかという情報も必要です。 アセンブリでは、BYTE PTRWORD PTRDWORD PTR(やQWORD PTR)で表します。

さて、あるメモリアドレス0xFEEDFACE0x1が4バイトで格納されていたとします。格納方法として、リトルエンディアンとビッグエンディアンがあります。

ビッグエンディアンの場合、0x00 0x00 0x00 0x01となります。ここで、WORD PTR [0xFEEDFACE]で参照するとどうなるでしょうか。 この場合、0xFEEDFACEから2バイト(WORD)取得します。ということは、0x00 0x00です。

一方で、リトルエンディアンの場合、0x01 0x00 0x00 0x00です。したがって、WORDであっても0x01 0x000x01を取得できます。

このことから、リトルエンディアンはキャストが可能というメリットがあることがわかります。


  1. 終端とは、構造体のサイズやそれに格納されているデータのサイズまで、またはNULL文字が考えられます。 ↩︎

Powered by Hugo & Kiss.