GCCはIA16 (8086で始まる16ビットのIntelアーキテクチャー)をサポートするようになっているが、int型、long型、ポインター型のサイズがどうなっているのか理解していなかった。 GCCのオンラインマニュアルでのx86の-m16オプションの説明を読むと、 -m16でも-m32と同様にint型、long型、ポインター型は全て32ビットであるらしい。 それを確認するには、以下のようにすれば良さそうだ。
まず、以下のようなC言語のソースコードsizeof.cを作成する。
$ cat sizeof.c int main(void) { int int_size = sizeof(int); int long_size = sizeof(long); int pointer_size = sizeof(void *); return 0; }
これをコンパイルして、オブジェクトファイルsizeof.oを生成する。
$ gcc -m16 -c sizeof.c
これをディスアセンブルする。すると、$0x4というのが代入される部分が3箇所あることが分かる。 つまり、4バイト=32ビットがint型、long型、ポインター型のサイズであることが分かる。
$ objdump -d sizeof.o sizeof.o: file format elf32-i386 Disassembly of section .text: 00000000 <main≶: 0: 66 55 push %bp 2: 66 89 e5 mov %sp,%bp 5: 66 83 ec 10 sub $0x10,%sp 9: 67 66 c7 45 fc 04 00 movw $0x4,-0x4(%di) 10: 00 00 add %al,(%eax) 12: 67 66 c7 45 f8 04 00 movw $0x4,-0x8(%di) 19: 00 00 add %al,(%eax) 1b: 67 66 c7 45 f4 04 00 movw $0x4,-0xc(%di) 22: 00 00 add %al,(%eax) 24: 66 b8 00 00 mov $0x0,%ax 28: 00 00 add %al,(%eax) 2a: 66 89 ec mov %bp,%sp 2d: 66 5d pop %bp 2f: 66 c3 retw
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。