前提
使用環境:仮想環境(VirtualBox)上の64bit KaliLinux(ホストOSは64bitのWindows10)
質問内容
リトルエンディアンでのメモリ上のデータ配置とメモリアクセス時の処理について質問がございます。
下記のプログラムを実行すると
c
1#include <stdio.h> 2 3int main(){ 4 char *st = "\x41\x42\x43\x44\x45\x46\x47\x48"; 5 6 for(int i=0;i<8;i++){ 7 printf("%x ",st[i]); 8 } 9 printf("\n"); 10}
41 42 43 44 45 46 47 48
がコマンドライン上に出力されます。
この時、メモリ上において文字列stの先頭番地を0x100とします。
次にGDBでこのプログラムをデバックした時に、xコマンドを使って0x100番地以降のメモリ内容を2通り調べました。
1つはコマンド:x/xg 0x100 を入力(つまり0x100番地を先頭に8バイト単位でメモリ内容を表示する)して調べるやり方。
この場合は以下の結果が出力されました。
0x100 : 0x4847464544434241
これについてはリトルエンディアンでの配置通りなので疑問はないです。
しかし、2つ目の調べ方 コマンド:x/8xb 0x100を入力する(つまり0x100番地を先頭に1バイト単位でメモリ内容を表示する)して調べるやり方で疑問が出ました。
このやり方では以下の結果が出力されました。冒頭プログラムの結果と同様です。
0x100 : 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
この結果に対して疑問があります。
64bit環境では8バイト単位でリトルエンディアンでメモリにデータが配置されるので、
文字列stのデータがメモリに格納される時、実際のメモリ上のデータ配置は1つめの調べ方の結果のはず。
なので、0x100番地には0x48が配置されている(つまりst[0]=0x48になる)はずなのに、
冒頭のプログラムの結果や2つめの調べ方の結果では0x100番地には0x41が配置されている(つまりst[0]=0x41になる)ことになってしまっています。
以上を踏まえて質問としては
冒頭のプログラムの結果は、本来はリトルエンディアンによる実際のデータ配置を踏まえて
48 47 46 45 44 43 42 41
になるはずなのに、なぜそうならないのか? です。
まとまりがなくわかりにくい文章で申し訳ございませんが、ご回答いただけると幸いです。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/13 06:35
2019/04/13 07:28