Трансляция программы

Под трансляцией (ассемблированием) понимается преобразование исходного текста программы в машинный объектный код. На этом этапе формируется объектный модуль (объектный файл) – файл с расширением .obj, содержащий представление исходной программы в машинных кодах, а также служебную информацию необходимую для отладки и компоновки данного модуля с другими объектными модулями.

Для получения объектного модуля исходный файл необходимо подвергнуть трансляции с помощью утилиты tasm.exe. Формат командной строки для трансляции:

 

tasm.exe имя_исходного_файла.asm

 

В результате будет получен файл имя_исходного_файла.obj.

В процессе трансляции исходной программы транслятор (по-другому его можно назвать ассемблер – отсюда и название «язык ассемблера») делает два просмотра исходного текста программы, или два прохода. Основная причина этого заключается в наличии в программе ссылок вперед, то есть таких ссылок, значение которых на данном этапе преобразования транслятором еще не определено. При первом проходе транслятор просматривает всю исходную программу и строит таблицу идентификаторов, используемых в программе – имен полей данных, переменных и меток программы (см. разд.4) и их относительных адресов (смещений) в программе. В первом проходе подсчитывается объем объектного кода, но сам объектный код не генерируется.

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

Если программа содержит ошибки, то транслятор выдаст на экран строки сообщений, начинающиеся словами «Error» (ошибка) или «Warning» (предупреждение). Наличие строки «Error» говорит о том, что в программе есть недопустимые, с точки зрения синтаксиса, комбинации символов. Сама логика работы программы для транслятора не имеет никакого значения. Наличие строки «Warning» означает, что конструкция синтаксически правильна, но ее выполнение может привести (а может и не привести) к некорректным результатам. После этих слов следует номер в скобках строки, в которой находится ошибка, а также краткое описание ошибки на английском языке.

Удобно анализировать код программы и возникающие ошибки и предупреждения используя специальный файл листинга (файл с расширением .lst). Формат командной строки для получения файла листинга (вместе с объектным модулем):

 

tasm.exe имя_исходного_файла.asm /l

 

В результате будут получены файлы имя_исходного_файла.obj и имя_исходного_файла.lst.

Файл листинга для программы, показанной на рис.3.2, приведен на рис.3.3. В файле листинга для каждой команды указываются ее машинный (объектный) код и смещение (эффективный адрес) в кодовом сегменте. В конце листинга формируются таблицы, которые содержат информацию о метках и сегментах, используемых в программе, и выводятся сообщения об ошибках и предупреждениях в программе (при их наличии).

 

Turbo Assembler Version 4.1 08/08/11 22:17:30 Page 1

prog.asm

 

1 0000 codesg SEGMENT PARA 'Code'

2 ASSUME CS:codesg,DS:codesg, SS:codesg, ES:nothing

3 ORG 100H

4 0100 EB 04 90 begin: JMP main

5 ;-------------------------------------------------------------

6 0103 05 fld1db DB 5

7 0104 FB fld2db DB -5

8 0105 FB fld3db DB 251

9 ;-------------------------------------------------------------

10 0106 main PROC NEAR

11 0106 8A 26 0103r MOV AH,byte ptr fld1db

12 010A 8A 3E 0104r MOV BH,byte ptr fld2db

13 010E 8A 2E 0105r MOV CH,byte ptr fld3db

14 0112 C3 RET

15 0113 main ENDP

16 0113 codesg ENDS

17 END begin

Рис. 3.3. Листинг программы

 

 

Turbo Assembler Version 4.1 08/08/11 22:17:30 Page 2

Symbol Table

 

 

Symbol Name Type Value

 

??DATE Text "08/08/11"

??FILENAME Text "prog "

??TIME Text "22:17:30"

??VERSION Number 040A

@CPU Text 0101H

@CURSEG Text CODESG

@FILENAME Text prog

@WORDSIZE Text 2

BEGIN Near CODESG:0100

FLD1DB Byte CODESG:0103

FLD2DB Byte CODESG:0104

FLD3DB Byte CODESG:0105

MAIN Near CODESG:0106

 

Groups & Segments Bit Size Align Combine Class

 

CODESG 16 0113 Para none CODE

Окончание рис. 3.3