インテルのCPUはリトルエンディアン、ルネサスの SH や H8 はビッグエンディアン。
これをどうやったら確かめられるか考えた。GDBにはシミュレータ機能があることを思い出した。そこで、簡単なソースコードをシミュレータで動かし、メモリの内容を表示させて、バイトオーダーを確認してみた。
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)
こちらは確かにビッグエンディアンになっていることを確認できた。