最近どうっすか?

コンピュータをメインに技術系の話題について書いていけたらいいなぁ。

LSBファーストのバイトオーダー(データとコード)

LSBファースト(リトルエンディアンとも言う)のバイトオーダーについて書いてみる。

LSBファーストのバイトオーダーっていうのは、0x10203040っていう4バイトのデータがあったら、メモリへの配置は次のようになる。

0x40 n 番地
0x30 n+1番地
0x20 n+2番地
0x10 n+3番地

ふむふむ、よく分かった。

では、データじゃなくてコードだったら?

8086でALレジスタに0x20っていうデータを代入するコードの場合:

アセンブラニーモニック
MOV AL, 0x20

マシン語コード
Hex: B020

このマシン語コードはメモリ上にどう配置されるのか?

0xB0 n 番地
0x20 n+1番地

となる。
LSBファーストと言っても命令を表すバイトが先にくる。
そうしないと、フェッチしたとき次の命令が何バイト命令かもわからない。

では、8086でAX(16bit)レジスタに0x2000というデータを代入するコードの場合:

アセンブラニーモニック
MOV AX, 0x2000

マシン語コード
Hex: B80020

0xB8 n 番地
0x00 n+1番地
0x20 n+2番地

頭の01が命令(LD BC)で0020が代入する即値(0x2000)になる。

つまり言いたいことはLSBファーストでもコードの場合:

  1. OP(コード)のバイトを先に置く
  2. オペランドのデータはバイトオーダーが変換される