Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
19
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

00000H 00015h 0016h codesg

00020H 0007fh 0060h stacksg

Для ответа на четвертый запрос - нажмите Return, что укажет

компоновщику LINK принять остальные параметры по yмолчанию. Описание

библиотечных средств можно найти в руководстве по DOS.

На данном этапе единственной возможной ошибкой может быть yказание

неправильных имен файлов. Исправить это можно только перезапуском

программы LINK. В прил.4 перечислен ряд pежимов компоновщика LINK.

ВЫПОЛНЕНИЕ ПРОГРАММЫ

________________________________________________________________

После ассемблирования и компановки программы можно (наконец-то!)

выполнить ее. На рис.4.2 приведена схема команд и шагов для

ассемблирования, компановки и выполнения программы EXASM1. Если EXE-файл

находится на дисководе B, то выполнить ее можно командой:

B:EXASM1.EXE или B:EXASM1

DOS предполагает, что файл имеет тип EXE (или COM), и загружает файл

для выполнения. Но так как наша программа не вырабатывает видимых

результатов, выполним ее трассировкой под отладчиком DEBUG. Введите

DEBUG B:EXASM1.EXE

В результате DOS загрузит программу DEBUG, который, в свою очередь,

загрузит требуемый EXE-модуль. После этого отладчик выдаст дефис (-) в

качестве приглашения. Для просмотра сегмента стека введите

D SS:0

Эту область легко узнать по 12-кратному дублированию константы

STACKSEG. Для просмотра сегмента кода введите

D CS:0

Сравните машинный код с листингом ассемблера:

1E2BC050B823010525008BD803 ...

Непосредственные операнды, приведенные в листинге ассемблирования как

0123 И 0025 в памяти представлены в виде 2301 и 2500 соответственно. В

данном случае листинг ассемблирования не вполне соответствует машинному

коду. Все двухбайтовые адреса (слова) и непосредственные операнды в

машинном коде хранятся в обратном порядке.

__________________________________________________________________________

__________________________________________________________________________

Рис.4.2. Схема ассемблирования, компановки и выполнения программы.

Введите R для просмотра содержимого регистров и выполните прогpамму с

помощью команды T (трассировка). Обратите внимание на воздействие двух

команд PUSH на стек - в вершине стека теперь находится содержимое регистра

DS и нулевой адрес.

В процессе пошагового выполнения программы обратите внимание на

содержимое регистров. Когда вы дойдете до команды RET, можно ввести Q

(Quit - выход) для завершения работы отладчика.

Используя команду dir, можно проверить наличие ваших файлов на диске:

DIR B:EXASM1.*

В результате на экране появится следующие имена файлов: EXASM1.BAK

(если для корректировки EXASM1.ASM использовался редактор EDLIN),

EXASM1.ASM, EXASM1.OBJ, EXASM1.LST, EXASM1.EXE и EXASM1.CRF.

Последовательность этих файлов может быть иной в зависимости от того, что

уже находится на диске.

Очевидно, что разработка ряда программ приведет к занятию дискового

пространства. Для проверки оставшегося свободного места на диске полезно

использовать команду DOS CHKDSK. Для удаления OBJ-, CRF-, BAK- и

LST-файлов с диска следует использовать команду ERASE (или DEL):

ERASE B:EXASM1.OBJ, ...

Следует оставить (сохранить) ASM-файл для последующих изменений и

EXE-файл для выполнения.

В следующем разделе представлено определение данных в сегменте

данных. Позже будет описана таблица перекрестных cсылок.

ПРИМЕР ИСХОДНОЙ ПРОГРАММЫ

________________________________________________________________

Особенность программы, приведенной на рис.4.1, состоит в том, что она

не содержит определения данных. Обычно все программы имеют определенные

константы, рабочие поля для арифметических вычислений и области для

операций ввода-вывода.

В главе 2 (рис.2.3) была рассмотрена программа в машинных кодах, в

которой были определены два поля данных. В этой главе на рис.4.3

приводится аналогичная программа, но на этот раз написанная на языке

ассемблера и для краткости уже ассемблированная. Эта программа знакомит с

несколькими новыми особенностями.

__________________________________________________________________________

1 page 60,132

2 TITLE EXASM2 (EXE) Операции пересылки и сложения

3 ;-------------------------------------------------

4 0000 STACKSG SEGMENT PARA SACK 'Stack'

5 0000 20 [ DB 32 DUP(?)

6 ????

7 ]

8

9 0040 STACKSG ENDS

10 ;-------------------------------------------------

11 0000 DATASG SEGMENT PARA 'Data'

12 0000 00FA FLDA DW 250

13 0002 007D FLDB DW 125

14 0004 ???? FLDC DW ?

15 0006 DATASG ENDS

16 ;-------------------------------------------------

17 0000 CODESG SEGMENT PARA 'Code'

18 0000 BEGIN PROC FAR

19 ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:NO

THING

20 0000 1E PUSH DS ;Записать DS в стек

21 0001 2B C0 SUB AX,AX ;Записать в стек

22 0003 50 PUSH AX ; нулевой адрес

23 0004 B8 ---- R MOV AX,DATASG ;Поместить адрес DATASG

24 0007 8E D8 MOV DS,AX ; в регистр DS

25

26 0009 A1 0000 R MOV AX,FLDA ;Переслать 0250 в AX

27 000C 03 06 0002 R ADD AX,FLDB ;Прибавить 0125 к AX

28 0010 A3 0004 R MOV FLDC,AX ;Записать сумму в FLDC

29 0013 CB RET ;Вернуться в DOS

30 0014 BEGIN ENDP

31 0014 CODESG ENDS

32 END BEGIN

------------------------------------------------------------------------

Segments and Groups:

N a m e Size Align Combine Class

CODESG . . . . . . . . . . . . 0014 PARA NONE 'CODE'

DATASG . . . . . . . . . . . . 0006 PARA NONE 'DATA'

STACKSG. . . . . . . . . . . . 0040 PARA STACK 'STACK'

Symbols:

N a m e Type Value Attr

BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0014

FLDA . . . . . . . . . . . . . L WORD 0000 DATASG

FLDB . . . . . . . . . . . . . L WORD 0002 DATASG

FLDC . . . . . . . . . . . . . L WORD 0004 DATASG

__________________________________________________________________________

Рис.4.3. Листинг ассемблирования программы с сегментом данных.

Сегмент стека содержит директиву DW (Define Word - определить cлово),

описывающая 32 слова, в которых генерируется неопределенное значение

обозначенное знаком вопроса (?). Определение размера стека в 32 слова

является наиболее реальным, так как в больших программах может

потребоваться много "прерываний" для ввода-вывода и вызовов подпрограмм -

все они используют стек. Определение стека дублированием константы

'STACKSEG' в примере на pис.3.2 необходимо лишь для удобства при работе с

отладчиком DEBUG.

З а м е ч а н и е: Определяйте размер стека не менее 32 слов. При

малых размерах стека ни ассемблер, ни компоновщик не смогут определить

этого и выполнение программы может разрушиться самым непредсказуемым

образом.

В примере на рис.4.3 определен сегмент данных DATASG, начинающийся по

относительному адресу 0000. Этот сегмент содержит три значения в формате

DW. Поле FLDA определяет слово (два байта), содержащее десятичное значение