リトルエンディアン:
mov eax,4
push dword 0x44434241
mov ebx,1
mov ecx,esp
mov edx,4
int 0x80
add esp,4
DCBAではなくABCDを印刷する理由がわかりません。41が最低のアドレスにあり、44が最高のアドレスにあるのに、なぜですか?たとえば、私が書くとき
x: dd 0x12345678
78は最下位アドレスにありますが、それでもここの番号は78563412ではなく12345678です。
0x12345678
は 32 ビットの値で、リトル エンディアン システムで表され0x78
、最小のアドレス (これを address と呼びましょうaddr
) と0x12
最大のアドレスで表されます。
addr addr+1 addr+2 addr+3 single 32-bit number
+----+ +----+ +----+ +----+ +--------------+
| 78 | | 56 | | 34 | | 12 | represents | 12345678 |
+----+ +----+ +----+ +----+ +--------------+
32 ビット値は、最下位アドレスと最上位アドレスに0x44434241
格納されます。0x41
0x44
addr addr+1 addr+2 addr+3 single 32-bit number
+----+ +----+ +----+ +----+ +--------------+
| 41 | | 42 | | 43 | | 44 | represents | 44434241 |
+----+ +----+ +----+ +----+ +--------------+
しかし、最初の例のコードは、メモリを 32 ビットの数値として使用していませんwrite
。システム コールを使用して、一連のバイトをに書き込みますstdout
。このバイト シーケンスは、メモリに格納されている順序で書き込まれます。
addr
+----+
| 41 | => single byte 'A' is printed, then...
+----+
addr+1
+----+
| 42 | => ...single byte 'B' is printed, then...
+----+
addr+2
+----+
| 43 | => ...single byte 'C' is printed, then...
+----+
addr+3
+----+
| 44 | => ...single byte 'D' is printed
+----+
私はこれが起こっていると信じています->「最も一般的なケースは、単一の16、32、または64ビットワード内でバイトがどのように順序付けられているかを指し、エンディアンはバイトオーダーと同じです。通常の対比はより大きなデータ項目内で、最上位または最下位のバイトが最初に順序付けられるか、つまり、最下位のバイト アドレスに順序付けられるか。」
ウィキペディアより