
- •Глава 1 Введение в семейство персональных компьютеров ibm pc
- •Глава 2 Выполнение программ
- •Глава 3 Требования языка ассемблер
- •Глава 4 Ассемблирование и выполнение программ
- •Глава 5 Определение данных
- •Глава 8 Экранные операции I: Основные свойства
- •Глава 9 Экранные операции II: Расширенные возможности
- •Глава 10 Экранные операции III: Цвет и графика
- •Глава 11 Команды обработки строк
- •Глава 12 Арифметические операции I: Обработка двоичных данных
- •Глава 13 Арифметические операции II:
- •Глава 14 Обработка таблиц
- •Глава 15 Дисковая память I: Организация
- •Глава 16 Дисковая память II: Функции базовой версии dos
- •Глава 17 Дисковая память III: Расширенные функции dos
- •Глава 18 Дисковая память IV: Функции bios
- •Глава 19 Печать
- •Глава 20 Макросредства
- •0000 Csig segment para 'Code'
- •0100 Eb 00 begin: jmp short main
- •0102 Main proc near
- •0109 Main endp
- •0109 Cseg ends
- •20.1. Напишите необходимые директивы: а) для подавления всех команд,
- •04Af в регистр cs. Комбинация этих адресов указывает на первую выполняемую
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para 'Code'
- •13D40 плюс 0000. Обратите внимание, что основная программа начинается по
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'code'
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'code'
- •Ibm Personal Computer Linker
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'Code'
- •1. Инициализирующая команда push ds заносит адрес сегмента в стек. Этот
- •010 Clear ,32768!
- •1. Наберите ассемблерную подпрограмму, сохраните ее под именем
- •Ibm Personal Computer Linker
- •Version 2.30 (c) Copyright ibm Corp. 1981, 1985
- •00000H 00011h 00012h codesg code
- •Ibm Personal Computer Basic
- •00 Указатель блока вызывающей программы
04Af в регистр cs. Комбинация этих адресов указывает на первую выполняемую
команду в вызываемой подпрограмме:
Кодовый сегмент 04AF0
Смещение в IP 0200
Действительный адрес 04CF0
При выходе из вызванной процедуры межсегментная команда возврата REP
восстанавливает оба адреса в регистрах CS и IP и таким образом передает
управление на следующую после CALL команду.
АТРИБУТЫ EXTRN и PUBLIC
________________________________________________________________
Рассмотрим основную программу (MAINPROG), которая вызывает
подпрограмму (SUBPROG) с помощью межсегментного CALL, как показано на
рис.21.2.
Команда CALL в MAINPROG должна "знать", что SUBPROG существует вне
данного сегмента (иначе ассемблер выдаст сообщение о том, что
идентификатор SUBPROG не определен). С помощью директивы EXTRN можно
указать ассемблеру, что ссылка на SUBPROG имеет атрибут FAR,
т.е.определена в другом ассемблерном модуле. Так как сам ассемблер не
имеет возможности точно определить такие ссылки, он генерирует "пустой"
объектный код для последующего заполнения его при компановке:
9A 0000 ---- E
Подпрограмма SUBPROG содержит директиву PUBLIC, которая указывает
ассемблеру и компоновщику, что другой модуль должен "знать" адрес SUBPROG.
В последнем шаге, когда оба модуля MAINPROG и SUBPROG будут успешно
ассемблированы в объектные модули, они могут быть скомпонованы следующим
образом:
Запрос компоновщика LINK: Ответ:
Object Modules [.OBJ]: B:MAINPROG+B:SUBPROG
Run File [filespec.EXE]: B:COMBPROG (или другое имя)
List File [NUL.MAP]: CON
Libraries [.LIB]: [return]
Компоновщик устанавливает соответствия между адресами EXTRN в одном
объектном модуле с адресами PUBLIC в другом и заносит необходимые
относительные адреса. Затем он объединяет два объектных модуля в один
выполняемый. При невозможности разрешить ссылки компоновщик выдает
сообщения об ошибках. Следите за этими сообщениями прежде чем пытаться
выполнить программу.
__________________________________________________________________________
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ EXTRN SUBPROG:FAR ¦
¦ MAINPROG: . ¦
¦ . ¦
¦ CALL SUBPROG ¦
¦ . ¦
¦ . ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ PUBLIC SUBPROG ¦
¦ SUBPROG: . ¦
¦ . ¦
¦ . ¦
¦ RET ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
__________________________________________________________________________
Рис.21.2. Межсегментный вызов.
Директива EXTRN
-----------------
Директива EXTRN имеет следующий формат:
EXTRN имя:тип [, ... ]
Можно определить более одного имени (до конца строки) или закодировать
дополнительные директивы EXTRN. В другом ассемблерном модуле
соответствующее имя должно быть определено и идентифицировано как PUBLIC.
Тип элемента может быть ABS, BYTE, DWORD, FAR, NEAR, WORD. Имя может быть
определено через EQU и должно удовлетворять реальному определению имени.
Директива PUBLIC
------------------
Директива PUBLIC указывает ассемблеру и компоновщику, что адрес
указанного идентификатора доступен из других программ. Директива имеет
следующий формат:
PUBLIC идентификатор [, ... ]
Можно определить более одного идентификатора (до конца строки) или
закодировать дополнительные директивы PUBLIC. Идентификаторы могут быть
метками (включая PROC-метки), переменными или числами. Неправильными
идентификаторами являются имена регистров и EQU-идентификаторы,
определяющие значения более двух байт.
Рассмотрим три различных способа компановки программ.
ПРОГРАММА: ИСПОЛЬЗОВАНИЕ ДИРЕКТИВ EXTRN и PUBLIC ДЛЯ МЕТОК
_______________________________________________________________
__________________________________________________________________________
page 60,132
TITLE CALLMULL1 (EXE) Вызов подпрограммы умнож.
EXTRN SUBMUL:FAR
;-----------------------------------------------