Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29195
Скачиваний: 1689
Приложения
310
Однако если файлы, присоединяемые указанной ранее директивой, большие
и в основном неизменяемые (т. е. готовые процедуры, не требующие редактирова-
ния), то постоянное ассемблирование этих процедур может занять много времени.
В таком случае, каждая отдельно взятая часть программы (ассемблерный код) ас-
семблируется по отдельности, при этом создается один или несколько объектных
файлов (с расширением OBJ), которые не требуют постоянного ассемблирования,
только компоновки (линковки) (см. разд. П1.3).
П1.3. Компоновка
Если в процессе ассемблирования не было выявлено ошибок в ассемблерном
листинге, то программа-ассемблер создаcт объектный файл (с расширением OBJ).
Затем необходимо воспользоваться компоновщиком (линковщиком), который
входит в комплект программы-ассемблера. Данная процедура выполняется гораздо
быстрее ассемблирования.
Именно компоновщик создает готовый к запуску файл (программу) с расшире-
нием COM или EXE из объектного файла (OBJ). Оба типа имеют отличия в струк-
туре ассемблерной программы. Первый тип (COM) не может превышать 64 Кбайт
и используется только в MS-DOS (и для совместимости поддерживается в Windows),
однако он очень компактный и удобный для написания небольших программ и ре-
зидентов. В большинстве случаев, если программа написана на чистом ассемблере
под MS-DOS, нет необходимости создавать EXE-файлы. В этой книге в части I
рассматриваются именно программы типа COM.
В отличие от создания программ типа COM, при создании стандартных EXE-
программ под MS-DOS нет необходимости указывать какие-либо параметры
линковщику при компоновке. Дело в том, что компоновщик не может автомати-
чески определить, какой тип подвергается компоновке.
Линковщик также проверяет, нет ли каких-либо ошибок в объектном файле, но
не грамматических, а логических. Например, отсутствие необходимой объектной
библиотеки, указанной в самом файле либо в командной строке (программа-
ассемблер этого не делает).
Если ошибки не были обнаружены, компоновщик создает машинный код
(программу типа COM или EXE), которую можно запускать на выполнение.
П
Р И МЕ Ч А Н И Е
Исходя из всего вышеизложенного, делаем вывод, что для создания машинного кода
необходимо воспользоваться как минимум двумя программами: программой-
ассемблером и компоновщиком. Однако для MASM версий 6.00—6.13 достаточно
запустить файл ml.exe, указав в командной строке параметр /AT в процессе
ассемблирования. В таком случае MASM (если не было ошибок в ассемблерном
листинге) автоматически запустит компоновщик (LINK.EXE), который создаст файл
типа COM.
Приложение 1. Ассемблирование программ…
311
П1.3.1. Ассемблирование и компоновка программ
пакетами Microsoft (MASM)
Допустим, вы создали в текстовом редакторе файл с именем PROG.ASM.
Если вы используете MASM 6.11—6.13, то в командной строке необходимо
указать следующее:
> ML.EXE PROG.ASM /AT
В результате будут созданы два файла: PROG.OBJ и PROG.COM. Файл
PROG.OBJ, скорее всего, вам больше не понадобится, и его можно удалить,
а PROG.COM можно запускать на выполнение. Это и будет машинный код ас-
семблерной программы. Параметр
/AT
указывает программе-ассемблеру (MASM),
что после ассемблирования, в случае, если ошибок не будет обнаружено, следует
запустить компоновщик (LINK.EXE) и передать ему параметры для создания файла
типа COM.
В
Н И МА Н И Е
!
Параметр /AT должен быть набран ПРОПИСНЫМИ символами!
Приложение 2
Типичные ошибки
при ассемблировании программы
Tlink32.exe не компилирует файл, выдает ошибку:
Fatal: 16 bit segments not supported in module prog.asm
TASM32.EXE и TLINK32.EXE — ассемблер и компоновщик только для
программ, написанных под ОС Windows!
Для наших примеров на данном этапе необходимы TASM.EXE и TLINK.EXE
(мы рекомендуем MASM 6.11—6.13).
LINK при компиляции выдает:
LINK : warning L4021: no stack segment
Однако файл с раширением EXE создается.
Данное сообщение свидетельствует о том, что вы забыли указать стек в EXE-
файле. Если вы написали программу типа COM, а ассемблируете ее как EXE,
опуская необходимые параметры для COM-файла, то данная COM-программа
будет работать некорректно.
Если вы создаете EXE-файл, то просто игнорируйте это сообщение либо создай-
те сегмент стека.
Обратите внимание, что в этой книге рассматриваются в большинстве своем
программы типа COM. Как получить COM-файл, сказано в приложении 1.
Ассемблер (TASM) выдает ошибку:
**Error** prog4.asm(15) Near jump or call to different CS
Поместите в вашу программу после строки
CSEG segment
следующее:
ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
Сассемблированный файл не работает: компьютер виснет (программа работает
не так, как надо: вместо выводимой строки — какие-то непонятные символы и пр.),
хотя программа набрана верно (точь-в-точь, как в примере из книги).
Проблема, вероятно, в том, что вы написали COM-файл, а ассемблируете его,
как EXE. Как правильно сассемблировать COM-файл, сказано в приложении 1.
Приложение 3
Таблицы и коды символов
П3.1. Основные символы ASCII
В табл. П3.1 приведены ASCII-символы от 00h до 7Fh, их коды в десятичной
(колонка DEC), шестнадцатеричной (колонка HEX) и двоичной (колонка BIN) сис-
темах счисления.
В колонке Скан-код приводятся скан-коды нажатия соответствующих клавиш,
расположенных на основной клавиатуре. Скан-код отпускания клавиши соответст-
вует скан-коду нажатия клавиши с установленным старшим седьмым битом (OR
10000000b).
Полный список скан-кодов клавиатуры см. в табл. П3.4.
В колонке Описание содержится дополнительная информация о соответствую-
щем символе и/или его коде.
Условные сокращения:
DOS — отображение символа на экране при помощи вывода с использованием
функций
09h
и
02h
прерывания
21h
MS-DOS;
ПОВ — отображение символа на экране при помощи вывода с использованием
метода прямого отображения в видеобуфер.
Таблица также позволяет легко и быстро переводить числа в разных системах
счисления от 00h до 7Fh (от 0 до 127).
Таблица П3.1. ASCII-символы от 00h до 7Fh, их коды в десятичной,
шестнадцатеричной и двоичной системах счисления
Символ
DEC
HEX
BIN
Скан-код Описание
0
00
00000000
—
Null
DOS
, ПОВ: отображает как "про-
бел" (ASCII 20h)
☺
1
01
00000001
—
—
☻
2
02
00000010
—
—
♁
3
03
00000011
—
—
♂
4
04
00000100
—
Конец передачи (<Ctrl>+<D>)
Приложения
314
Таблица П3.1 (продолжение)
Символ
DEC
HEX
BIN
Скан-код Описание
♀
5
05
00000101
—
—
☿
6
06
00000110
—
—
•
7
07
00000111
—
Звонок
DOS
: выдает звуковой сигнал
в динамике
ПОВ: выводит сам символ
●
8
08
00001000
0Eh
<Backspace
> (удаление символа
слева от курсора)
DOS
: передвигает курсор на од-
ну позицию влево
ПОВ: выводит сам символ
○
9
09
00001001
0Fh
<Tab>
DOS: вставляет табуляцию
(перемещает курсор максимум
на 8 позиций вправо)
ПОВ: выводит сам символ
◙
10
0A
00001010
—
Перевод строки
DOS
: переводит курсор на сле-
дующую строку текущего столбца
ПОВ: выводит сам символ
☾
11
0B
00001011
—
—
☽
12
0C
00001100
—
—
♃
13
0D
00001101
—
Возврат каретки
DOS
: переводит курсор в начало
текущей строки
ПОВ: выводит сам символ
♄
14
0E
00001110
—
—
☼
15
0F
00001111
—
—
►
16
10
00010000
—
—
◄
17
11
00010001
—
—
↕
18
12
00010010
—
—
‼
19
13
00010011
—
—
¶
20
14
00010100
—
—
§
21
15
00010101
—
—
22
16
00010110
—
—