GDBのシミュレータでエンディアンを確かめる

インテルのCPUはリトルエンディアン、ルネサスの SH や H8 はビッグエンディアン

 

これをどうやったら確かめられるか考えた。GDBにはシミュレータ機能があることを思い出した。そこで、簡単なソースコードをシミュレータで動かし、メモリの内容を表示させて、バイトオーダーを確認してみた。

 

C言語ソースコード

int main(void){
	int a = 0x5678;
	int b = 0x1234;
	int c = a + b;
	return c;
}    

gdb のシミュレータで実行する。まずインテルCPUの x86

(gdb) list
1
2       int main(void){
3               int a = 0x5678;
4               int b = 0x1234;
5               int c = a + b;
6
7               return c;
8       }
(gdb) b main
Breakpoint 1 at 0x40157d: file sample01.c, line 3.
(gdb) r
Starting program: /e/Projects/MPU/SH/mySamples/x86
[New Thread 7868.0x121c]
[New Thread 7868.0x212c]

Thread 1 hit Breakpoint 1, main () at sample01.c:3
3               int a = 0x5678;
(gdb) n
4               int b = 0x1234;
(gdb) x &a
0x66fe4c:       0x00005678
(gdb) x/4b &a
0x66fe4c:       0x78    0x56    0x00    0x00
(gdb) n
5               int c = a + b;
(gdb) x &b
0x66fe48:       0x34
(gdb) x/4b &b
0x66fe48:       0x34    0x12    0x00    0x00
(gdb) n
7               return c;
(gdb) x &c
0x66fe44:       0xac
(gdb) x/4b &c
0x66fe44:       0xac    0x68    0x00    0x00
(gdb) x/12b &c
0x66fe44:       0xac    0x68    0x00    0x00    0x34    0x12    0x00    0x00
0x66fe4c:       0x78    0x56    0x00    0x00
(gdb)
    

バイトの並びがリトルエンディアンになっていることを確認できた。 次にビッグエンディアンルネサス SH についてみてみる。

  $ sh-elf-gdb sample01
GNU gdb (GDB) 7.5.1
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i386-pc-mingw32msvc --target=sh-elf".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from E:\Projects\MPU\SH\mySamples\sample01...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .init, size 0x36 vma 0x1000
Loading section .text, size 0x10d0 vma 0x1038
Loading section .fini, size 0x2a vma 0x2108
Loading section .rodata, size 0x24 vma 0x2134
Loading section .eh_frame, size 0x4 vma 0x2158
Loading section .ctors, size 0x8 vma 0x21dc
Loading section .dtors, size 0x8 vma 0x21e4
Loading section .jcr, size 0x4 vma 0x21ec
Loading section .data, size 0x83c vma 0x21f0
Loading section .got, size 0xc vma 0x2a2c
Loading section .stack, size 0x4 vma 0x300000
Start address 0x1038
Transfer rate: 52672 bits in <1 sec.
(gdb) list
1
2       int main(void){
3               int a = 0x5678;
4               int b = 0x1234;
5               int c = a + b;
6
7               return c;
8       }
(gdb) b 7
Breakpoint 1 at 0x11e6: file sample01.c, line 7.
(gdb) r
Starting program: E:\Projects\MPU\SH\mySamples\sample01

Breakpoint 1, main () at sample01.c:7
7               return c;
(gdb) x &a
0x2fffac:       0x00005678
(gdb) x/4b &a
0x2fffac:       0x00    0x00    0x56    0x78
(gdb) x/w &b
0x2fffa8:       0x00001234
(gdb) x/4b &b
0x2fffa8:       0x00    0x00    0x12    0x34
(gdb) x/w &c
0x2fffa4:       0x000068ac
(gdb) x/4b &c
0x2fffa4:       0x00    0x00    0x68    0xac
(gdb) x/12b &c
0x2fffa4:       0x00    0x00    0x68    0xac    0x00    0x00    0x12    0x34
0x2fffac:       0x00    0x00    0x56    0x78
(gdb)  

こちらは確かにビッグエンディアンになっていることを確認できた。