- •Глава 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 Указатель блока вызывающей программы
010 Clear ,32768!
020 ' для BLOAD
030 ' для DEFSEG
040 ' для точки входа в CALL
050 ' для вызова ASM-модуля
060 FOR N = 1 TO 5
070 INPUT "Hours "; H
080 INPUT "Rate "; R
090 W = H * R
100 PRINT "Wage = " W
110 NEXT N
120 END
_____________________________________________________________________
TITLE LINKBAS Ассемблерная подпрограмма, вызываемая из BASIC
CODESG SEGMENT PARA 'CODE'
ASSUME CS:CODESG
CLRSCRN PROC FAR
PUSH BP ;Сохранить BP
MOV BP,SP ;База списка параметров
MOV AX,0600H ;Функция прокрутки
MOV BH,07 ; всего
MOV CX,0000 ; экрана
MOV DX,184FH
INT 10H
POP BP
RET ;Завершить подпрограмму
CLRSCRN ENDP
CODESG ENDS
END
__________________________________________________________________________
Рис.21.7. Основная программа на языке BASIC и подпрограмма на
ассемблере.
Рассмотрим теперь простой пример компановки программы для
BASIC-интерпретатора и подпрограммы на ассемблере. В этом примере
BASIC-программа запрашивает ввод значений времени и расценки и выводит на
экран их произведение - размер зарплаты. Цикл FOR-NEXT обеспечивает
пятикратное выполнение ввода и затем программа завершается. Пусть BASIC-
программа вызывает ассемблерный модуль, который очищает экран.
На рис. 21.7 приведена исходная BASIC-программа и ассемблерная
подпрограмма. Обратите внимание на следующие особенности BASIC-программы:
оператор 10 очищает 32К байт памяти; операторы 20, 30, 40 и 50 временно
содержат комментарии.
Позже мы вставим BASIC-операторы для связи с ассемблерным модулем.
BASIC-программу можно сразу проверить. Введите команду BASIC и затем
наберите все пронумерованные операторы так, как они показаны в примере.
Для выполнения программы нажмите F2. Не забудьте сохранить текст программы
с помощью команды
SAVE "B:BASTEST.BAS"
Обратите внимание на следующие особенности ассемблерной подпрограммы:
- отсутствует определение стека, так как его обеспечивает BASIC;
программа не предусмотрена для отдельного выполнения и не может быть
выполнена;
- подпрограмма сохраняет в стеке содержимое регистра BP и
записывает значение регистра SP в BP;
- подпрограмма выполняет очистку экрана, хотя она может быть
изменена для выполнения других операций, таких как прокрутка экрана
вверх или вниз или установка курсора.
Все что осталось - это связать эти программы вместе. Следующие
действия предполагают, что системная дискета (DOS) находится на дисководе
A, а рабочие программы - на дисководе B:
1. Наберите ассемблерную подпрограмму, сохраните ее под именем
B:LINKBAS.ASM и оттранслируйте ее.
2. Используя компоновщик LINK, сгенерируйте объектный модуль, который
будет загружаться в старшие адреса памяти:
LINK B:LINKBAS,B:LINKBAS/HIGH,CON;
3. С помощью отладчика DEBUG загрузите BASIC - компилятор: DEBUG
BASIC.COM.
4. По команде отладчика R выведите на экран содержимое регистров.
Запишите значения в регистрах SS, CS и IP.
5. Теперь установите имя и загрузите скомпонованный ассемблерный модуль
следующими командами:
N B:LINKBAS.EXE
L
6. По команде R выведите на экран содержимое регистров и запишите
значения в CX, CS и IP.
7. Замените содержимое регистров SS, CS и IP значениями из шага 4. (Для
этого служат команды R SS, R CS и R IP).
8. Введите команду отладчика G (go) для передачи управления в BASIC. На
экране должен появиться запрос из BASIC-программы.
9. Для того, чтобы сохранить ассемблерный модуль, введите следующие
команды (без номеров операторов):
DEF SEG = &Hxxxx (значение в CS из шага 6)
BSAVE "B:CLRSCRN.MOD",0,&Hxx (значение в CX из шага 6)
Первая команда обеспечивает адрес загрузки модуля в память для
выполнения. Вторая команда идентифицирует имя модуля, относительную
точку входа и размер модуля. По второй команде система запишет модуль
на дисковод B.
10. Теперь необходимо модифицировать BASIC-программу для компоновки.
Можно загрузить ее сразу, находясь в отладчике, но вместо этого
наберите команду SYSTEM для выхода из BASIC и, затем, введите Q для
выхода из отладчика DEBUG. На экране должно появиться приглашение DOS
11. Введите команду BASIC, загрузите BASIC-программу и выведите ее на
экран:
BASIC
LOAD "B:BASTEST.BAS"
LIST
12. Измените операторы 20, 30, 40 и 50 следующим образом:
20 BLOAD "B:CLRSCRN.MOD"
30 DEF SEG = &Hxxxx (значение в CS из шага 6)
40 CLRSCRN = 0 (точка входа в подпрограмму)
50 CALL CLRSCRN (вызов подпрограммы)
13. Просмотрите, выполните и сохраните измененную BASIC-программу.
Если BASIC-программа и ассемблерные команды были введены правильно, а
также правильно установлены шестнадцатеричные значения из регистров, то
связанная программа должна сразу очистить экран и выдать запрос на ввод
времени и расценки. На рис.21.8 приведен протокол всех шагов - но
некоторые значения могут отличаться в зависимости от версии операционной
системы и размера памяти.
Приведенный пример выбран намеренно простым только для демонстрации
компоновки. Можно использовать более сложную технологию, используя
передачу параметров из BASIC-программы в ассемблерную подпрограмму с
помощью оператора
CALL подпрограмма (параметр-1,параметр-2,...)
Ассемблерная подпрограмма может получить доступ к этим параметрам,
используя регистр BP в виде [BP], как это делалось ранее на рис.21.3. В
этом случае необходимо определить операнд в команде RET, соответствующий
длине адресов параметров в стеке. Например, если оператор CALL передает
три параметра то возврат должен быть закодирован в виде RET 6.
__________________________________________________________________________
D>LINK