Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Разработка одномодульной программы

Рассмотрим процесс создания программы на языке ассемблера с использованием пакета TASM фирмы Borland. В качестве основы возьмем каркас программы, приведенный в разделе 4.3, и дополним его некоторым содержанием.

 

STACKSG SEGMENT STACK

DB 128 DUP(?)

STACKSG ENDS

 

DATASG SEGMENT

A DB 1

B DW?

Text DB "This is simple text$"

DATASG ENDS

 

CODESG SEGMENT

ASSUME CS: CODESG, DS: DATASG, SS: STACKSG

S: MOV AX, DATASG

MOV DS, AX

MOV AH, 0

MOV AL, A

MOV CL, 10

SHL AX, CL

MOV B, AX

MOV AH, 09h

MOV DX, OFFSET Text

INT 21h

MOV AX, 4C00h

INT 21h

CODESG ENDS

 

END S

 

В сегменте данных описана байтовая переменная A, переменная B, размером в слово, и переменная Text. Обратите внимание, Text описана как байтовая, хотя она является строковой. Поэтому с помощью Text можно непосредственно обратиться только к первому символу, а к остальным можно получить доступ только по смещению.

В кодовом сегменте вначале инициализируется сегментный регистр DS. Затем в регистр AX помещается значение переменной A. В связи с тем, что регистр AX является 16-ти разрядным, а переменная A байтовая, напрямую переслать в регистр значение не получится – возникнет ошибка трансляции «типы операндов различны». Поэтому сначала необходимо обнулить регистр AH, а в регистр AL передать значение A. Команда логического сдвига выполняет умножение на 1024 и результат помещается в переменную B.

Все описанные действия невидимы для пользователя. В программу добавлен вызов функции 09h прерывания 21h для вывода на экран текстовой строки. Смещение строки находится в регистре DX. Последним действием является вызов функции 4Ch прерывания 21h для корректного завершения программы при выходе в MS-DOS.

Набрать текст программы можно в любом текстовом редакторе в кодировке ASCII, например, Norton Editor. Программу необходимо сохранить под именем FIRST.ASM в той директории, где расположены файлы TASM.EXE и TLINK.EXE (по умолчанию эта директория C:\TASM\BIN).

Теперь необходимо провести трансляцию программы с помощью TASM.EXE. В результате ассемблирования будет создан объектный (.OBJ) файл с тем же именем, что и исходный (.ASM). Следующая команда:

 

TASM FIRST

 

выполнит ассемблирование исходного файла FIRST.ASM и создаст объектный файл FIRST.OBJ. Расширение указывать необязательно, если у файла оно равно ASM.

Если необходимо, ассемблер может создать специальный файл листинга с расширением.LST. Для этого в командной строке нужно ввести (расширение OBJ необязательно):

 

TASM FIRST /L /C

 

Имена объектного файла и (или) файла листинга не обязательно должны совпадать с именем исходного файла, но практически очень редко появляется причина, чтобы эти имена различались. Если все же имя объектного файла должно быть иным, оно указывается через запятую после имени исходного файле:

 

TASM FIRST, MYFIRST

 

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

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

Ниже приводится файл листинга для нашего примера.

 

 

Turbo Assembler Version 4.0 29/08/04 18:00:17 Page 1

first.ASM

 

2 0000 STACKSG SEGMENT STACK

3 0000 80*(??) DB 128 DUP(?)

4 0080 STACKSG ENDS

6 0000 DATASG SEGMENT

7 0000 01 A DB 1

8 0001???? B DW?

9 0003 54 68 69 73 20 69 73+ Text DB "This is simple text$"

10 20 73 69 6D 70 6C 65+

11 20 74 65 78 74 24

12 0017 DATASG ENDS

14 0000 CODESG SEGMENT

15 ASSUME CS: CODESG, DS: DATASG, SS: STACKSG

17 0000 B8 0000s S: MOV AX, DATASG

18 0003 8E D8 MOV DS, AX

19 0005 B4 00 MOV AH, 0

20 0007 A0 0000r MOV AL, A

21 000A B1 0A MOV CL, 10

22 000C D3 E0 SHL AX, CL

23 000E A3 0001r MOV B, AX

24 0011 B4 09 MOV AH,9

25 0013 BA 0003r MOV DX,OFFSET Text

26 0016 CD 21 INT 21h

27 0018 B8 4C00 MOV AX,4C00h

28 001B CD 21 INT 21h

30 001D CODESG ENDS

31 END S

 

 

Turbo Assembler Version 4.0 29/08/04 18:00:17 Page 2

 

Symbol Table

 

Symbol Name Type Value Cref (defined at #)

 

??DATE Text "29/08/04"

??FILENAME Text "first "

??TIME Text "18:00:17"

??VERSION Number 0400

@CPU Text 0101H

@CURSEG Text CODESG #2 #6 #14

@FILENAME Text FIRST

@WORDSIZE Text 2 #2 #6 #14

A Byte DATASG:0000 #7 20

B Word DATASG:0001 #8 23

S Near CODESG:0000 #17 31

TEXT Byte DATASG:0003 #9 25

 

Groups & Segments Bit Size Align Combine Class Cref (defined at #)

 

CODESG 16 001D Para none #14 15

DATASG 16 0017 Para none #6 15 17

STACKSG 16 0080 Para Stack #2 15

 

 

В файле листинга строки программы помещаются в следующем формате:

 

<номер строки><смещение><машинный код><исходная строка>

 

Номера строк используются для работы с таблицей перекрестных ссылок, создаваемой транслятором: ссылка к той или иной строке выполняется по этому номеру. Например, директива ASSUME будет иметь в файле листинга номер 12, директива END номер 31 и т.д. Помните, что номер строки не является номером фактической строки в исходном файле.

Смещение указывает расположение в текущем сегменте машинного кода или данных для соответствующей строки исходной программы. Например, переменная B начинается в сегменте данных со смещением 1, т.к. она следует сразу после байтовой переменной A.

Машинный код есть последовательность шестнадцатеричных значений байтов и слов для соответствующей строки исходной программы. Например, MOV AX, DATASG начинается в сегменте кода со смещением 0. Информация, помещаемая справа от поля смещения для данной команды, и есть ассемблированный для нее машинный код, поэтому машинный код команды MOV AX, DATASG равен B8 0000s (в шестнадцатеричной записи). Значение 0B8h есть команда машинного языка, загружающая AX константой, а 0000s это константа DATASG, загружаемая в AX.

Фактически 0000s просто метка-заполнитель для значения DATASG. Дело в том, что значения сегментов присваиваются не транслятором, а компоновщиком, и TASM не может поместить туда верное значение. Однако TASM может сообщить, что это значение определяет значение сегмента и будет определено компоновщиком. Таким признаком служит символ s, добавляемый в конец машинного кода, генерируемого для команды.

Аналогичным образом, смещение машинного кода, ассемблированного для команды:

 

MOV AL, A

 

оканчивается символом r, который указывает, что когда компоновщик будет объединять данный сегмент с другими сегментами, это смещение может быть перемещено.

В табл. 73 приведен полный список обозначений, которые TASM использует для указания характеристик ассемблирования.

 

 

Табл. 73. Специальные символы ассемблирования.

Обозначение Описание
r Фиксация смещения для символических имен в модуле.
s Фиксация сегмента для символических имен в модуле.
sr Фиксация сегмента и смещения для символических имен в модуле.
e Фиксация смещения внешнего символического имени.
se Фиксация указателя внешнего символического имени.
so Только сегментная фиксация.
+ Объектный код был усечен.

 

 

В листинге объектного кода r, s и sr используются для обозначения типов фиксации символических имен в модуле по смещению, сегменту и указателю (сегмент и смещение). Символ e указывает на фиксацию смещения внешнего символического имени, а se на фиксацию указателя внешнего символического имени. Фиксация сегмента внешнего символического имени обозначается буквой s, как и для локальных символических имен. Поле объектного кода может также содержать в последнем столбце символ +, означающий, что имеется еще объектный код для вывода, но он усечен.

Суммарно команда MOV AX, DATASG ассемблируется в 3 байта машинного кода. Следующая команда MOV DS, AX, начинается в сегменте кода со смещением 3. Машинный код 8e D8 соответствует MOV DS, AX. Он имеет длину 2 байта, поэтому следующая команда должна начаться со смещением 5.

Обратите внимание, в файл листинга включается только первые 7 байт машинного кода, генерируемого для строки:

 

Text DB "This is simple text$"

 

Поля машинного кода, которые слишком длинны и не помещаются в поле <машинный код>, обычно усекаются и завершаются знаком (+), показывающим, что имеются еще байты, сгенерированные при ассемблировании, но в файле листинга не показанные. Если требуется отобразить все байты машинного кода, то следует использовать директиву %NOTRUNC, которая отменяет усечение кодов, не помещающихся в данном поле.

Исходная строка представляет строку исходного файла программы, с комментариями. Некоторые строки ассемблерной программы, в которых содержатся только комментарии и ничего более, не вызывают генерирования каких-либо машинных кодов. Для таких строк поля <смещение> и <машинный код> не создаются, но номер строки им все равно присваивается.

После исправления всех ошибок (если они были обнаружены) с помощью файла листинга вновь выполним команду трансляции и получим объектный модуль FIRST.OBJ. Модуль будет содержать машинные коды созданной программы. Однако модуль не является исполняемым, его не удастся загрузить в память и выполнить. Для этого следует выполнить следующую команду:

 

TLINK FIRST.OBJ

 

Программа TLINK.EXE называется компоновщиком. Она создаст перемещаемый исполняемый модуль FIRST.EXE. Вызвать модуль FIRST.EXE на выполнение можно из операционной системы MS-DOS или из отладчика DEBUG. Обычно программы вызывается из MS-DOS, когда есть твердая уверенность в правильности ее исполнения. Для выполнения программы необходимо ввести команду:

 

FIRST.EXE

 

По этой команде операционная система MS-DOS проведет считывания файла FIRST в любое подходящее место оперативной памяти и затем передаст ему управление. По окончании работы управление будет передано операционной системе, и программа может быть вновь запущена. На рис. 26 показаны выполненные действия по трансляции и компоновке программы.

 

 

 

Рис. 26. Трансляция и компоновка программы на ассемблере.




Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 1786; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.