Yamamoto's Laboratory

ソースプログラム

lec.cのソースプログラムは,次のようになっています.

01: #include "3664.h"
02: #include "h8c.h"
03: #pragma interrupt
04: void irq0(void){
05:   prohibit_irq();       /*割り込み禁止*/
06:   IRR1 &= 0xfe;         /*IRQ0 割り込み要求フラグをクリアー*/
07:   PDR5 = 0xff;        /* ポート5の全出力を1に */
08:   wait();               /* 数秒待機 */
09:   PDR5 = 0x00;          /* ポート5の全出力を0に */
10:   permit_irq();         /* 割り込み許可 */
11: }
12: 
13: 
14: int main(void)
15: {
16:   init_led();           /* port5を使うときの初期化 */
17:   init_irq0();          /* irq0割り込みを使うときの初期化 */
18: 
19:   while(1){
20:     sleep();
21:   }
22: }

アセンブラ

C言語のプログラムをコマンド「h8300-hms-gcc -S led.c」でアセンブラに変換する.すると,以下のアセンブラのファイル led.s ができる.

01: ;    GCC For the Hitachi H8/300
02: ;    By Hitachi America Ltd and Cygnus Support
03: 
04: 
05:     .file    "led.c"
06:     .section .text
07:     .align 1
08:     .global _irq0
09: _irq0:
10:     push    r6
11:     mov.w    r7,r6
12:     push    r0
13:     push    r1
14:     push    r2
15:     push    r3
16:     jsr    @_prohibit_irq
17:     mov.b    @-10,r2l
18:     and    #-2,r2l
19:     mov.b    r2l,@-10
20:     mov.b    #-1,r2l
21:     mov.b    r2l,@-40
22:     jsr    @_wait
23:     sub.b    r2l,r2l
24:     mov.b    r2l,@-40
25:     jsr    @_permit_irq
26:     pop    r3
27:     pop    r2
28:     pop    r1
29:     pop    r0
30:     pop    r6
31:     rte
32:     .align 1
33:     .global _main
34: _main:
35:     push    r6
36:     mov.w    r7,r6
37:     jsr    @_init_led
38:     jsr    @_init_irq0
39: .L3:
40:     jsr    @_sleep
41:     bra    .L3
42:     .end
43:     .ident
44: "GCC: (GNU) 3.2"

オブジェクトファイル

C言語のプログラムをコマンド gcc -c led.c でオブジェクトファイルに変換する.すると,以下のオブジェクトファイル led.o ができる.

00000000: 8300 0003 4658 4728 0000 0148 0000 0011  ....FXG(...H....
00000010: 0000 0004 2e74 6578 7400 0000 0000 0000  .....text.......
00000020: 0000 0000 0000 004c 0000 008c 0000 00d8  .......L........
00000030: 0000 0000 0007 0000 0000 0020 2e64 6174  ........... .dat
00000040: 6100 0000 0000 004c 0000 004c 0000 0000  a......L...L....
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0040 2e62 7373 0000 0000 0000 004c  ...@.bss.......L
00000070: 0000 004c 0000 0000 0000 0000 0000 0000  ...L............
00000080: 0000 0000 0000 0000 0000 0082 6df6 0d76  ............m..v
00000090: 6df0 6df1 6df2 6df3 5e00 0000 6a0a fff6  m.m.m.m.^...j...
000000a0: eafe 6a8a fff6 faff 6a8a ffd8 5e00 0000  ..j.....j...^...
000000b0: 18aa 6a8a ffd8 5e00 0000 6d73 6d72 6d71  ..j...^...msmrmq
000000c0: 6d70 6d76 5670 6df6 0d76 5e00 0000 5e00  mpmvVpm..v^...^.
000000d0: 0000 5e00 0000 4000 0000 000c 0000 000b  ..^...@.........
000000e0: 0000 0000 0046 5343 0000 0020 0000 000c  .....FSC... ....
000000f0: 0000 0000 0046 5343 0000 002a 0000 000d  .....FSC...*....
00000100: 0000 0000 0046 5343 0000 003e 0000 000e  .....FSC...>....
00000110: 0000 0000 0046 5343 0000 0042 0000 000f  .....FSC...B....
00000120: 0000 0000 0046 5343 0000 0046 0000 0010  .....FSC...F....
00000130: 0000 0000 0046 5343 0000 004b 0000 0002  .....FSC...K....
00000140: ffff ffff 0012 5343 2e66 696c 6500 0000  ......SC.file...
00000150: 0000 0000 fffe 0000 6701 6c65 642e 6300  ........g.led.c.
00000160: 0000 0000 0000 0000 0000 0000 2e4c 3300  .............L3.
00000170: 0000 0000 0000 0046 0001 0000 0600 2e74  .......F.......t
00000180: 6578 7400 0000 0000 0000 0001 0000 0301  ext.............
00000190: 0000 004c 0007 0000 0000 0000 0000 0000  ...L............
000001a0: 0000 2e64 6174 6100 0000 0000 004c 0002  ...data......L..
000001b0: 0000 0301 0000 0000 0000 0000 0000 0000  ................
000001c0: 0000 0000 0000 2e62 7373 0000 0000 0000  .......bss......
000001d0: 004c 0003 0000 0301 0000 0000 0000 0000  .L..............
000001e0: 0000 0000 0000 0000 0000 5f69 7271 3000  .........._irq0.
000001f0: 0000 0000 0000 0001 0000 0200 5f6d 6169  ............_mai
00000200: 6e00 0000 0000 003a 0001 0000 0200 0000  n......:........
00000210: 0000 0000 0004 0000 0000 0000 0000 0200  ................
00000220: 5f77 6169 7400 0000 0000 0000 0000 0000  _wait...........
00000230: 0200 0000 0000 0000 0012 0000 0000 0000  ................
00000240: 0000 0200 0000 0000 0000 001e 0000 0000  ................
00000250: 0000 0000 0200 0000 0000 0000 0028 0000  .............(..
00000260: 0000 0000 0000 0200 5f73 6c65 6570 0000  ........_sleep..
00000270: 0000 0000 0000 0000 0200 0000 0033 5f70  .............3_p
00000280: 726f 6869 6269 745f 6972 7100 5f70 6572  rohibit_irq._per
00000290: 6d69 745f 6972 7100 5f69 6e69 745f 6c65  mit_irq._init_le
000002a0: 6400 5f69 6e69 745f 6972 7130 00         d._init_irq0.

このセクション情報は,コマンド「h8300-hms-objdump -h led.o」で見ることができます.このコマンドを使うと,以下のように出力されます.

led.o:     ファイル形式 coff-h8300

セクション:
索引名          サイズ      VMA       LMA       File off  Algn
  0 .text         0000004c  00000000  00000000  0000008c  2**1
                  CONTENTS, ALLOC, LOAD, RELOC, CODE
  1 .data         00000000  0000004c  0000004c  00000000  2**1
                  ALLOC, LOAD, DATA
  2 .bss          00000000  0000004c  0000004c  00000000  2**1
    ALLOC, NEVER_LOAD

このオブジェクトファイルに含まれるセクションは.textのみで,4Cバイト(72バイト)アドレス0000008cからはじまることが分かります.逆アセンブルするとオブジェクトファイルとアセンブラー言語の関係がよくわかります.逆アセンブルのコマンドは「h8300-hms-objdump -d led.o」です.その結果,以下が得られます.

この逆アセンブルで出力される部分が.textセクションです.オブジェクトファイルの16進数との対応をみると,機械語が書かれている部分が分かる.機械語ん部分はオブジェクトファイルのアドレスの0000008cから000000d8まで4cバイトで,以下の逆アセンブルされた内容と一致している.

led.o:     ファイル形式 coff-h8300

セクション .text の逆アセンブル:

00000000 <_irq0>:
   0:   6d f6           6d f6             mov.w r6,@-e7
   2:   0d 76           0d 76             mov.w r7,r6
   4:   6d f0           6d f0             mov.w r0,@-e7
   6:   6d f1           6d f1             mov.w r1,@-e7
   8:   6d f2           6d f2             mov.w r2,@-e7
   a:   6d f3           6d f3             mov.w r3,@-e7
   c:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0
  10:   6a 0a ff f6     6a 0a ff f6       mov.b @0xfff6:16,r2l
  14:   ea fe           ea fe             and.b #0xfe,r2l
  16:   6a 8a ff f6     6a 8a ff f6       mov.b r2l,@0xfff6:16
  1a:   fa ff           fa ff             mov.b #0xff,r2l
  1c:   6a 8a ff d8     6a 8a ff d8       mov.b r2l,@0xffd8:16
  20:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0
  24:   18 aa           18 aa             sub.b r2l,r2l
  26:   6a 8a ff d8     6a 8a ff d8       mov.b r2l,@0xffd8:16
  2a:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0
  2e:   6d 73           6d 73             mov.w @r7+,r3
  30:   6d 72           6d 72             mov.w @r7+,r2
  32:   6d 71           6d 71             mov.w @r7+,r1
  34:   6d 70           6d 70             mov.w @r7+,r0
  36:   6d 76           6d 76             mov.w @r7+,r6
  38:   56 70           56 70             rte

0000003a <_main>:
  3a:   6d f6           6d f6             mov.w r6,@-e7
  3c:   0d 76           0d 76             mov.w r7,r6
  3e:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0
  42:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0

00000046 <.L3>:
  46:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0
  4a:   40 00           40 00             bra   .0 (4c)