IA16なGCCのint、long、ポインターのサイズを確認する

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 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

Asterisk 16で、ソフトフォンとの間をPJSIPによる通信に変更する

Asteriskに接続している一部のクライアントはIAX2で通信するようにしたのだが、 もう1台はZoiPerではなく baresip+ を使っているので、 IAX2にすることはできない。 そこで、この端末についてもchan_sipではなくPJSIPに乗り換える...