Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29195

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Приложения 

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.  


background image

Приложение 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 должен быть набран ПРОПИСНЫМИ символами! 

 


background image

 

 

 

Приложение 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


background image

 

 

 

Приложение 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 

Скан-код  Описание 

 

00 

00000000 

— 

Null 

DOS

, ПОВ: отображает как "про-

бел" (ASCII 20h) 

☺ 

01 

00000001 

— 

— 

☻ 

02 

00000010 

— 

— 

♁ 

03 

00000011 

— 

— 

♂ 

04 

00000100 

— 

Конец передачи (<Ctrl>+<D>) 


background image

Приложения 

314 

Таблица П3.1 (продолжение) 

Символ 

DEC 

HEX 

BIN 

Скан-код  Описание 

♀ 

05 

00000101 

— 

— 

☿ 

06 

00000110 

— 

— 

• 

07 

00000111 

— 

Звонок 

DOS

: выдает звуковой сигнал  

в динамике 

ПОВ: выводит сам символ 

● 

08 

00001000 

0Eh 

<Backspace

> (удаление символа 

слева от курсора) 

DOS

: передвигает курсор на од-

ну позицию влево 

ПОВ: выводит сам символ 

○ 

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 

— 

—