Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC.doc
Скачиваний:
48
Добавлен:
25.05.2014
Размер:
3.21 Mб
Скачать

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