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)