- •Глава 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 Указатель блока вызывающей программы
Ibm Personal Computer Linker
Version 2.30 (C) Copyright IBM Corp 1981, 1985
Object Modules: B:CALLMUL3+B:SUBMUL3
Run File: [B:CALLMUL3.EXE]:
List File: [NUL.MAP]: CON
Libraries [.LIB]:
Start Stop Length Name Class
00000H 00019H 001AH CODESG CODE
00030H 00033H 0004H DATASG DATA
00040H 000BFH 0080H STACKSG STACK
PROGRAM entry point at 0000:0000
__________________________________________________________________________
Рис.21.5. Общие данные в подпрограмме.
Наличие общих данных предполагает возможность обработки в одном
ассемблерном модуле данных, которые определены в другом ассемблерном
модуле. Изменим предыдущий пример так, чтобы области QTY и PRICE
по-прежнему определялись в основной программе, но загрузка значений из
этих областей в регистры BX и AX выполнялась в подпрограмме. Такая
программа приведена на рис.21.5. В ней сделаны следующие изменения:
- В основной программе имена QTY и PRICE определены как PUBLIC.
Сегмент данных также определен с атрибутом PUBLIC. Обратите внимание
на атрибут Global (глобальный) для QTY и PRICE в таблице
идентификаторов.
- В подпрограмме имена QTY и PRICE определены как EXTRN и WORD.
Такое определение указывает ассемблеру на длину этих полей в 2 байта.
Теперь ассемблер сгенерирует правильный код операции для команд MOV,
а компоновщик установит значения операндов. Заметьте, что имена QTY и
PRICE в таблице идентификаторов имеют атрибут External (внешний).
Команды MOV в листинге подпрограммы имеют следующий вид:
A1 0000 E MOV AX,PRICE
8B 1E 0000 E MOV BX,QTY
В объектном коде шест.A1 обозначает пересылку слова из памяти в регистр
AX, а шест.8B - пересылку слова из памяти в регистр BX (объектный код для
операций с регистром AX чаще требует меньшее число байтов, чем с другими
регистрами). Трассировка выполнения программы показывает, что компоновщик
установил в объектном коде следующие операнды:
A1 0200
8B 1E 0000
Объектный код теперь идентичен коду сгенерированному в предыдущем примере,
где команды MOV находились в вызывающей программе. Это логичный результат,
так как операнды во всех трех программах базировались по регистру DS и
имели одинаковые относительные адреса.
Основная программа и подпрограмма могут определять любые другие
элементы данных, но общими являются лишь имеющие атрибуты PUBLIC и EXTRN.
Следуя основным правилам, рассмотренным в данной главе, можно теперь
компоновать программы, состоящие более чем из двух ассемблерных модулей и
обеспечивать доступ к общим данным из всех модулей. При этом следует
предусматривать стек достаточных размеров - в разумных пределах, для
больших программ определение 64 слов для стека бывает достаточным.
В гл.23 будет рассмотрены дополнительные свойства сегментов, включая
определение более одного сегмента данных и кодового сегмента в одном
ассемблерном модуле и использование директивы GROUP для объединения
сегментов в один общий сегмент.
ПЕРЕДАЧА ПАРАМЕТРОВ
________________________________________________________________
__________________________________________________________________________
page 60,132
TITLE CALLMULL4 (EXE) Передача параметров
; в подпрограмму
EXTRN SUBMUL:FAR
;-------------------------------------------------