Следующий шаг в процессе генерации исполняемого машинного кода — это генерация объектного кода (файл interrupt.o) из рассмотренного ассемблерного исходного кода. После обработки программой Ассемблер среды ICC12 рассмотренного текста будет получен следующий объектный код:
XН
H4 areas 4 global symbols
M interrupt.c
А text size 3D flags 0
S _main Def0000
S _TOIISR Def001A
А memory size В20 flags С
S _Timer_Overflow_interrupt_vector Def0B1E
А data size 1 flags 0
S _second Def0000
А idata size 1 flags 0
T 0В 1Е 00 1А
R 00 00 00 01 00 02 00 00
T 00 00 00
R 00 00 00 03
T 00 00 С6 80 7В 00 86 С6 80 7В 00 80 С6 80 7В
R 00 00 00 00
T 00 00 00 8F С6 FF 7В 00 02 10 EF 20 FE 3F 30 С6
R 00 00 00 00
T 00 1В 80 7В 00 8F F6 00 00 87 С3 00 01 7В 00 00
R 00 00 00 00 00 07 00 02 00 0E 00 02
T 00 29 F6 00 00 C1 7А 26 ОС F6 00 00 87 41 51 7B
R 00 00 00 00 00 03 00 02
Т 00 37 00 00 79 00 00 0B
R 00 00 00 00 00 05 00 02
Заметим, что в верхней половине представленного объектного кода, содержатся директивы для программы линковщика, а в нижней половине читатель может увидеть шестнадцатеричные коды инструкций ассемблера МК семейства 68HC12.
На заключительной стадии представленный выше объектный код обрабатывается программой линковщика. В результате формируются три файла: interrupt.lst, interrupt.map и interrupt.s19.
Файл листинга программы interrupt.lst представляет собой текстовый файл, который содержит команды ассемблера, машинные коды этих команд и абсолютные адреса в памяти микроконтроллера, в которых эти коды располагаются. Сгенерированный линковщиком файл листинга представлен ниже:
.module interrupt.c
.area memory(abs)
.org 0хb1е
0B1Е _ _Timer_Overflow_interrupt_vector: :
0B1Е 8044 .word _TOIISR
.area data
0800 _second::
0800 .blkb 1
.area idata
--- 0000 00 .byte 0
.area data
.area text
802А _main: :
;#include <383HC12-ver1.h>
;void TOIISR(void) ;
;#pragma interrupt_handler TOIISR()
;
;#pragma abs_address:0x0B1E
;void(*Timer_Overflow_interrupt_vector[]) ()={TOIISR};
;#pragma end_abs_address
;
;unsigned char second=0x00;
;
;void main(void)
;{
;TSCR=0x80;
802А C680 ldab #128
802С 7В0086 stab 0х86
;TMSK2=0x80;
802F C680 ldab #128
8031 7B008D stab 0x8d
;TFLG2=0x80;
8034 C680 ldab #128
8036 7B008F stab 0x8f
;DDRA=0xFF;
8039 C6FF ldab #255
803В 7В0002 stab 0x2
;CLI();
803Е 10EF cli
8040 L3:
8040 L4:
8040 20FE bra L3
8042 X0:
;while (1) {};
;EXIT();
8042 3F swi
; }
8043 L2:
8043 .dbline 0; func end
8043 3D rts
8044 _TOIISR: :
;
; void TOIISR(void) {
;TFLG2=0x80;
8044 C680 ldab #128
8046 7B008F stab 0x8f
;second += 1;
8049 f60800 ldab _second
804C 87 clra
804D C30001 addd #1
8050 7B0800 stab _second
;if(second == 122)
8053 F60800 ldab _second
8056 C17A cmрb #122
8058 260C bnе L7
;{
;PORTA = ~PORTA;
; vol
805A F60000 ldab 0
805D 87 clra
805E 41 comа
805F 51 comb
8060 7B0000 stab 0
;second = 0x00;
8063 790800 clr _second
;}
8066 L7:
;}
8066 L6:
8066 .dbline 0; func end
8066 0B rti
Файл листинга обычно используется в процессе отладки прикладной программы при выявлении несоответствий между задуманными программистом действиями и реальным ходом исполнения программного кода. Кроме того, в процессе отладки иногда полезно знать, какие коды должны быть расположены в ячейках с фиксированными адресами. Последнюю информацию наиболее удобно получить из файла карты памяти *.map (иногда этот файл называют файлом символьных меток). Пример файла карты памяти для программы sample.c приведен ниже.