リトルエンディアンのメリットを自分なりに考えた記事です。
x86において、データに何らかの演算をする場合、必ずレジスタを経由する必要があります。例えば、ADD命令の場合、どちらかのオペランドはレジスタです。 しかし、レジスタのサイズは32bitであれば4バイト、64bitであれば8バイトです。したがって、画像や動画のような大きなデータは、メモリ上に置かれます。
前述したように、レジスタのサイズは4〜8バイトなため、メモリ上の何MiBもあるデータを一気に読み込ませることはできません。 1バイトごと読み込んだり、あるいはUTF-16のように2バイトごと読み込むこととなります。それを、終端1までループすることでしょう。
このことから、そのアドレスから何バイト読み込む必要があるのかという情報も必要です。
アセンブリでは、BYTE PTR
やWORD PTR
、DWORD PTR
(やQWORD PTR
)で表します。
さて、あるメモリアドレス0xFEEDFACE
に0x1
が4バイトで格納されていたとします。格納方法として、リトルエンディアンとビッグエンディアンがあります。
ビッグエンディアンの場合、0x00 0x00 0x00 0x01
となります。ここで、WORD PTR [0xFEEDFACE]
で参照するとどうなるでしょうか。
この場合、0xFEEDFACE
から2バイト(WORD)取得します。ということは、0x00 0x00
です。
一方で、リトルエンディアンの場合、0x01 0x00 0x00 0x00
です。したがって、WORDであっても0x01 0x00
で0x01
を取得できます。
このことから、リトルエンディアンはキャストが可能というメリットがあることがわかります。
終端とは、構造体のサイズやそれに格納されているデータのサイズまで、またはNULL文字が考えられます。 ↩︎