2.4. Трансляция и сборка с помощью TASM.EXE и TLINK.EXE

Сегментом программы называется её часть, состоящая из команд или данных, размеры которой не превосходят 64 Кбайта. Компилятор TASMB.COM позволяет создавать лишь программы, каждая из которых состоит из одного сегмента. Для того чтобы создавать многосегментные программы, применяются компилятор tasm.exe фирмы Borland и компилятор masm.exe фирмы Microsoft. Эти компиляторы создают объектные файлы по заданным текстовым файлам. Затем созданные объектные файлы превращаются в загрузочные модули с помощью сборщиков tlink.exe и link.exe соответственно. Под загрузочным модулем понимается файл, готовый для загрузки и выполнения. Таким образом, программа создается за 2 шага:

Несмотря на то, что мы будем рассматривать компилятор tasm.exe, наши примеры будут состоять из программ, совместимых с masm.exe.

Работать с tasm.exe и tlink.exe лучше в режиме MS DOS. Желательно создать отдельную папку или использовать дискету, записав в них программы tasm.exe и tlink.exe. Текст программы лучше создавать и редактировать с помощью команды

edit prog.asm

где prog – произвольное имя.

Компиляция, в случае, когда текст программы состоит из одного файла prog.asm, выполняется с помощью команды

tasm prog

Сборка и превращение объектного файла в загрузочный модуль производится с помощью команды

tlink prog

Запуск полученной программы на выполнение производится с помощью команды

Prog

Текст программы отличается от текста, который готовился в среде TASMB.COM. Теперь он состоит из сегментов, причем после определения сегмента кодов (сегментом кодов называется сегмент, состоящий из машинных команд) указываются имена сегментов, связанных с сегментными регистрами:

имя     SEGMENT

            assume cs:имя, ds:имя2, es:имя3, ss:имя4

            …

имя     ENDS

имя2   SEGMENT

            …

имя2   ENDS

имя3   SEGMENT

            …

имя3   ENDS

имя4   SEGMENT

            …

имя4   ENDS

Директива SEGMENT может иметь параметры.

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

На схеме слева стоят значения адресов сегментов. Сегменту команд (кодов) отводится регистр CS, сегменту данных — DS или ES, сегменту стека – SS. Адрес байта данных вычисляется по формуле

Адрес = 16*DS + смещение

(или Адрес = 16*ES + смещение, если используется сегментный регистр ES). Адрес команды – с помощью счетчика команд:

Адрес = 16*CS+IP.

Адрес стека равен 16*SS+SP.

Пример. Напишем текст уже известной нам программы, которая выводит на экран сообщение «Hello, world». Известный нам текст надо модернизировать, добавив директивы определения начала и конца сегментов и команды установки регистра ds (регистр cs устанавливается автоматически).

С этой целью вводим

edit hello.asm <ENTER>

и набираем текст программы

<1> code SEGMENT

<2>        assume cs:code, ds:data

<3>        mov  ax, data      ; установка

<4>        mov  ds, ax        ; регистра ds

<5>        mov  dx, OFFSET mes ; вывод

<6>        mov  ah, 9         ; сообщения

<7>        int  21h           ; на экран

<8>        mov  ah, 10h       ; подождать нажатия

<9>        int  16h           ; любой клавиши

<10>        mov  ax, 4c00h     ; выход из

<11>        int  21h           ; программы

<12>        code ENDS

<13> data SEGMENT

<14> mes db ‘Hello, world’, 13, 10, ‘$’

<15> data ENDS

<16>        end

Запоминаем текст, выходим из редактора и вводим команду трансляции

tasm /l hello

В результате будут созданы файлы  hello.obj и hello.lst. Если есть ошибки, то их можно посмотреть в листинге hello.lst, исправить и снова выполнить трансляцию. В данной команде мы применяем ключ /l для создания листинга. Если ошибок нет, то производим сборку

tlink hello

В результате будет создана программа hello.exe, которую можно запускать на счет. Помимо команд установки регистра ds (состоящих из двух команд в силу того, что команда mov ds, data недопустима) мы добавим команду вызова прерывания 16h, для приема символа с клавиатуры. В данном случае функция 10h означает вызов обслуживающей подпрограммы, ожидающей нажатие клавиши и принимающей введенный символ в регистр AL.

Файлы, участвующие в компиляции и сборке

Процесс разработки программы с помощью tasm.exe и tlink.exe проходит шаги, показанные на следующем далее рис.2.2. В прямоугольниках написаны спецификации (имена и расширения) файлов, а на соединяющих эти прямоугольники стрелках – программы, участвующие в процессе разработки. Имена prog и x могут быть любыми.

В рисунке участвует файл prog.crf. Этот файл может быть включен в листинг. Он состоит из списка имен переменных и номеров операторов (строк), в которых встречаются эти имена. Возможно присоединение библиотечных модулей x.lib, созданных из объектных модулей с помощью программы tlib.exe.

Для того чтобы узнать формат строки и ключи для программы tasm, достаточно ввести команду

tasm <ENTER>

В общем случае для компиляции применяется команда

tasm fileset; …; fileset

где каждая строка fileset представляет собой запись вида

options sources, object, list, cross

В этой записи

· options – набор ключей (опций) компилятора;

· sources – набор имен файлов, содержащих исходные тексты;

· object – имя файла, в который будет записан созданный компилятором объектный модуль;

· list – имя файла, содержащего листинг;

· cross – имя файла с таблицей перекрестных ссылок.

Опции обычно разделяются пробелами, а имена файлов sources – пробелами, или знаком «+». Например, команда

tasm /e prog1+prog2, prog; /l prog3

приведет к созданию модуля prog.obj, в котором в силу ключа /e будут эмулироваться операции с плавающей точкой, модуля prog3.obj и prog3.lst. Модуль prog.obj будет результатом компиляции объединения исходных текстов  prog1.asm и prog2.asm.

Команда сборки вводится следующим образом

tlink options objects, exec, map, libraries

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

· options – набор ключей (опций);

· objects – список входных объектных файлов, разделенных знаками «+» или пробелами;

· exec – имя файла, в который будет записан созданный загрузочный модуль;

· map – карта распределения памяти;

· libraries – имена библиотек, содержащих подсоединяемые подпрограммы.

В частности, если указать опцию /t, то будет создан загрузочный модуль в формате COM. Например,

tlink /t mylib+prog

при наличии объектных модулей mylib.obj и prog.obj приведет к созданию файла  prog.com.