Трансляция программных модулей 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Трансляция программных модулей



Как уже обсуждалось в предыдущих главах, программный проект (программа) может состоять из нескольких модулей. В программном проекте, состоящем из нескольких файлов, появляется возможность нескольких видов трансляции.

Прежде всего, можно оттранслировать только один файл, не транслируя остальные файлы программного проекта. Это позволяет обнаружить и исправить все синтаксические ошибки в отдельном программном модуле. При трансляции каждого программного модуля на жёстком диске формируются перемещаемый файл в объектном формате, который затем будет использоваться для создания загрузочного файла программного проекта. Этот файл называется объектный модуль.

Одновременно с объектным модулем на диске формируется файл листинга программного модуля, в который помещается исходный текст программного модуля и сообщения о синтаксических ошибках. В листинге 24.1 приведен пример исходного текста, программы, написанного на языке программирования C, а в листинге 24.2 приведено содержимое файла листинга, создаваемого при трансляции этого исходного текста.

Листинг 24.1. Исходный текст программы.

/*========================= main.c ===========================

Программа лабораторной работы №5

 

Проект ОБУЧАЮЩИЕ ПРОГРАММЫ

Программист::::::::..

Версия 1.00

Написана::::::.

 

Последнее

изменение::::.

программы

============================================================*/

 

#include "ADuC812.h" //Подключить определения всех внутренних регистров ADuC812

 

#define ParPort 0x8 //Определить константу переключения на 8 страницу памяти

 

#define SvDiod *(volatile unsigned char xdata *)7 /*Переменная косвенной адресации 7 ячейки внешней памяти (светодиодов)*/

 

main()

{DPP=ParPort; //Подключиться к параллельному порту

SvDiod=1; //Зажечь светодиод номер 0

 

while(1) //Обеспечить зацикливание микроконтроллера

{ /*(чтобы не было программного сброса микросхемы */

} /*языком программирования) */

}

 

Листинг 24.2 Содержимое файла листинга.

C51 COMPILER V7.20 MAIN 08/06/2006 23:14:21 PAGE 1

 

 

C51 COMPILER V7.20, COMPILATION OF MODULE MAIN

OBJECT MODULE PLACED IN.\obj\main.obj

COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lst\

-main.lst) PAGEWIDTH(90) OBJECT(.\obj\main.obj)

 

line level source

 

1 /*========================= main.c ===========================

2 Программа лабораторной работы №5

4 Проект ОБУЧАЮЩИЕ ПРОГРАММЫ

5 Программист::::::::..

6 Версия 1.00

7 Написана::::::.

9 Последнее

10 изменение::::.

11 программы

12 ============================================================*/

14 #include "ADuC812.h"//Подключить определения всех внутренних регистров ADuC812

16 #define ParPort 0x8 //Определить константу переключения на 8 страницу памяти

18 #define SvDiod *(volatile unsigned char xdata *)7 /*Переменная косвенной

19 адресации 7 ячейки внешней памяти (светодиодов)*/

21 main()

22 {DPP=ParPort; //Подключиться к параллельному порту

23 1 SvDiod=1; //Зажечь светодиод номер 0

24 1

25 1 while(1) //Обеспечить зацикливание микроконтроллера

26 1 { /*(чтобы не было программного сброса микросхемы */

27 2 } /*языком программирования) */

28 1 }

 

 

MODULE INFORMATION: STATIC OVERLAYABLE

CODE SIZE = 11 ----

CONSTANT SIZE = ---- ----

XDATA SIZE = ---- ----

PDATA SIZE = ---- ----

DATA SIZE = ---- ----

IDATA SIZE = ---- ----

BIT SIZE = ---- ----

END OF MODULE INFORMATION.

 

 

C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

 

При трансляции программного модуля, написанного на языке программирования ассемблер, в листинг помещаются машинные коды команд процессора, и их адрес относительно начала программного модуля. Пример содержимого такого файла приведен в листинге 24.3.

 

Листинг 24. 3. Содержимое файла листинга программы, написанной на ассемблере.

A51 MACRO ASSEMBLER Модуль инициализации процессора 05/24/2004 14:00:11 PAGE 1

 

MACRO ASSEMBLER A51 V7.01

OBJECT MODULE PLACED IN.\OBJ\init.obj

ASSEMBLER INVOKED BY: F:\Keil\C51\BIN\A51.EXE init.asm NOMOD51 SET(SMALL) DEBUG PRINT(.\LST\init.lst) XREF OBJECT(.\OBJ\

init.obj) EP

 

LOC OBJ LINE SOURCE

 

1 $title (Модуль инициализации процессора)

3;========== init.asm ======================

4;Учебная программа

5;

6;Проект Аттестационная работа

7;Программист Борисенко С. т. 66-02-86

8;Версия 1.00

9;Написана 9 апреля 2004.

10;

11;Последнее 12 апреля 2004.

12;изменение v1.00

13;программы

14;============================================================

254 $LIST

256 _code segment code

258 public init

---- 260 rseg _code

262;--------------------------------------------

263;ПОДПРОГРАММА ИНИЦИАЛИЗАЦИИ МИКРОКОНТРОЛЛЕРА

264;-------------------------------------------

265;настраивает таймер 0 в качестве системных часов на период 10мс

266;(Этого периода достаточно для устранения дребезга клавиатуры)

0000 268 init:

269;--- Настроить Timer 0 ---------------------

0000 758901 270 mov TMOD, #00000001b

271; |

272; ||++--Выбрать режим 16-разрядного таймера

273; |+----Использовать внутреннюю синхронизацию

274; +-----Запретить управление таймером от INT0

0003 758A94 276 mov TL0, #LOW(-(F_ZQ/12)*10);Настроить таймер

0006 758C94 277 mov TH0, #HIGH(-(F_ZQ/12)*10);на период 10мс

0009 D28C 279 setb TR0;Включить таймер 0

280;----------------------------------------------------

282;--- Погасить светодиоды -----------------------------

000B C293 283 clr SV1

000D C294 284 clr SV2

000F 438E01 286 orl AUXR,#1;Запретить выдачу частоты ALE на выход

287;микроконтроллера

0012 75A882 288 mov IE,#10000010b

289;| |

290;| +--Разрешить прерывания от таймера 0

291;+--------Разрешить прерывания

292;----------------------------------------------------

0015 120000 F 294 call IndInit;Инициализировать ЖКИ дисплей

0018 22 295 ret

297 end

A51 MACRO ASSEMBLER Модуль инициализации процессора 05/24/2004 14:00:11 PAGE 3

 

XREF SYMBOL TABLE LISTING

---- ------ ----- -------

 

N A M E T Y P E V A L U E ATTRIBUTES / REFERENCES

AC........ B ADDR 00D0H.6 A 204#

ACC........ D ADDR 00E0H A 60#

ADRKLAV...... D ADDR 00A0H A 225#

EA........ B ADDR 00A8H.7 A 162#

ES........ B ADDR 00A8H.4 A 159#

IE........ D ADDR 00A8H A 56# 288

INDINIT...... C ADDR ----- EXT 252# 294

INIT....... C ADDR 0000H R SEG=_CODE 258 268#

INT0....... B ADDR 00B0H.2 A 178#

INT1....... B ADDR 00B0H.3 A 179#

IP........ D ADDR 00B8H A 58#

P0........ D ADDR 0080H A 30#

P1........ D ADDR 0090H A 52#

P2........ D ADDR 00A0H A 55# 225

P3........ D ADDR 00B0H A 57#

PCON....... D ADDR 0087H A 36#

PSW........ D ADDR 00D0H A 59#

PUTCHAR...... C ADDR ----- EXT 252#

SBUF....... D ADDR 0099H A 54#

SCON....... D ADDR 0098H A 53#

SP........ D ADDR 0081H A 31#

T0........ B ADDR 00B0H.4 A 180#

T1........ B ADDR 00B0H.5 A 181#

TCON....... D ADDR 0088H A 37#

TMOD....... D ADDR 0089H A 38# 270

_CODE....... C SEG 0019H REL=UNIT 256# 260

 

REGISTER BANK(S) USED: 0

 

ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)

 

При трансляции исходного текста программы, написанной на языке программирования высокого уровня, таком как C или PLM, программа-транслятор может быть настроена так, что она будет создавать файл с текстом исходного модуля, написанного на ассемблере или помещать операторы языка программирования ассемблер в листинг программного модуля. Таким образом, появляется возможность писать, и отлаживать программу на языке высокого уровня, а затем переводить её на язык программирования ассемблер и окончательно оптимизировать её вручную. В листинге 24.4 приведено содержимое файла листинга, создаваемого при трансляции исходного текста программы, написанного на языке C‑51, с ассемблерным кодом.

 

Листинг 24.4. Содержимое файла листинга.

C51 COMPILER V7.20 MAIN 08/06/2006 23:28:20 PAGE 1

 

C51 COMPILER V7.20, COMPILATION OF MODULE MAIN

OBJECT MODULE PLACED IN.\obj\main.obj

COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND CODE PRINT(.

-\lst\main.lst) PAGEWIDTH(90) OBJECT(.\obj\main.obj)

 

line level source

 

1 /*========================= main.c ===========================

2 Программа лабораторной работы №5

4 Проект ОБУЧАЮЩИЕ ПРОГРАММЫ

5 Программист::::::::..

6 Версия 1.00

7 Написана::::::.

9 Последнее

10 изменение::::.

11 программы

12 ============================================================*/

14 #include "ADuC812.h" //Подключить определения всех внутренних

15 // регистров ADuC812

16 #define ParPort 0x8 //Определить константу переключения на 8 страницу памяти

18 #define SvDiod *(volatile unsigned char xdata *)7 /*Переменная косвенной

19 адресации 7 ячейки внешней памяти (светодиодов)*/

21 main()

22 {DPP=ParPort; //Подключиться к параллельному порту

23 1 SvDiod=1; //Зажечь светодиод номер 0

24 1

25 1 while(1) //Обеспечить зацикливание микроконтроллера

26 1 { /*(чтобы не было программного сброса микросхемы */

27 2 } /*языком программирования) */

28 1 }

C51 COMPILER V7.20 MAIN 08/06/2006 23:28:20 PAGE 2

 

ASSEMBLY LISTING OF GENERATED OBJECT CODE

 

; FUNCTION main (BEGIN)

; SOURCE LINE # 21

; SOURCE LINE # 22

0000 758408 MOV DPP,#08H

; SOURCE LINE # 23

0003 900007 MOV DPTR,#07H

0006 7401 MOV A,#01H

0008 F0 MOVX @DPTR,A

0009?C0001:

; SOURCE LINE # 25

; SOURCE LINE # 26

; SOURCE LINE # 27

0009 80FE SJMP?C0001

; FUNCTION main (END)

 

MODULE INFORMATION: STATIC OVERLAYABLE

CODE SIZE = 11 ----

CONSTANT SIZE = ---- ----

XDATA SIZE = ---- ----

PDATA SIZE = ---- ----

DATA SIZE = ---- ----

IDATA SIZE = ---- ----

BIT SIZE = ---- ----

END OF MODULE INFORMATION.

 

C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 235; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.222.87.38 (0.019 с.)