Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000239.doc
Скачиваний:
23
Добавлен:
30.04.2022
Размер:
1.12 Mб
Скачать

3.7. Лабораторная работа № 1

Цели работы:

– закрепить знания по архитектуре процессора I8086 и организации адресации оперативной памяти;

– ознакомиться со структурой программы на ассемблере;

– освоить работу с ассемблером MASM, редактором связей LINK;

– создать и выполнить первую программу на ассемблере;

– освоить работу c интерактивным отладчиком AFD (трассировка выполнения программы, отображение регистров, сегментов памяти и т.п.);

– закрепить знания о директивах описания данных;

– закрепить знания о представлении целочисленных (знаковых и беззнаковых) данных в памяти ПК;

– закрепить знания о форматах команд и типах операндов на примере команд пересылки;

– освоить работу с арифметическими командами сложения и вычитания для знаковых и беззнаковых целочисленных операндов;

– закрепить знания о флагах условий и их формировании арифметическими командами.

– проверить правильность выполнения заданий №1, 3 и 4 второй части контрольной работы.

Среда выполнения:

Интерпретатор команд DOS, ассемблер MASM, интерактивный отладчик AFD.

Примеры программ на ассемблере

Пример 1. Данный пример демонстрирует структуру программы, дает образец правильного оформления программы на ассемблере. Программа выводит на экран три символа ‘*’, выдает приветствие и издает три звуковых сигнала.

; Сегмент стека

S SEGMENT STACK ; Начало сегмента

DW 64 DUP(0ABCDh) ; Минимальный стек

; (64 слова, 80h байт).

; Требуется для работы системы

; прерываний

S ENDS ; Конец сегмента

; Сегмент данных

D SEGMENT ; Начало сегмента

X DB 8 DUP(4) ; Резервирование 8 байт памяти,

; инициализированных числом 4.

; К первому байту можно обратиться ; по имени X, адрес второго – X+1 и ; т.д.

Y DB 'Hello, dear friend!!!',0Dh, 0Ah,'$'

; Задание константы-строки. В конце строки - символы CR

; и NL, а также признак конца строки при выводе ее на

; экран по функции №9 прерывания 21h.

Z DW N DUP(6B0Dh) ; N слов, инициализированных

; значением 6B0Dh

D ENDS ; Конец сегмента

; Сегмент кода

C SEGMENT

ASSUME SS:S, CS:C, DS:D

; Директива устанавливает соответствие между

; сегментами и сегментными регистрами. Может

; располагаться в любом месте, но до первого

; исполняемого оператора (обычно помещают в начале

; кодового сегмента)

MMM PROC FAR ; Код оформляется как

; процедура, которую будет

; вызывать DOS

; Выполнение соглашений DOS

PUSH DS ;Запись содержимого DS в стек,

; т.к. в него будут загружены свои данные

SUB AX, AX ; Обнуление регистра AX

PUSH AX ; Запись ноля в стек

; Загрузка базового адреса в сегментный регистр DS

; Регистры CS и SS устанавливаются системой.

MOV AX, D

MOV DS, AX

; Непосредственно сама программа

; вывод на экран 3 звездочек (посимвольно, функция №2) ; и перевод курсора на следующую строку

MOV AH, 2 ; Размещение в AH номера функции

; прерывания (02 - вывод символа на экран)

MOV DL, '*' ; Размещение в DL выводимого символа

INT 21h ; Вызов прерывания номер 21h

INT 21h

INT 21h

MOV DL, 0Dh ;CR

INT 21h

MOV DL, 0Ah ;LF

INT 21h

; Выдача звукового сигнала (3 раза). Выводится как

;обычный символ

MOV DL, 07h ;Размещение кода звукового

;сигнала в регистре данных

INT 21h

INT 21h

INT 21h

; Вывод строки-приветствия с помощью функции вывода

; строки (№9)

; Признаком конца строки является знак $

; Смещение начала строки передается через регистр

; данных DX

MOV AH, 9 ; Размещение номера функции прерывания

; в AH

MOV DX, OFFSET Y ; Размещение в DX смещения

; строки Y относительно

; начала сегмента

INT 21h ; Прерывание

; Возврат в DOS и окончание работы программы

RET ;Возврат в DOS

MMM ENDP ;Конец процедуры MMM

C ENDS ;Конец сегмента

END MMM ;Конец программы.

Пример 2. Программа для иллюстрации различных способов определения и пересылки данных.

; Сегмент стека

S SEGMENT STACK

DW 64 DUP(?)

S ENDS ; Конец сегмента

; Сегмент данных

D SEGMENT

X DB 0Bh ; 1 байт 0Bh

XX DB 3 dup (0CBh) ; 3 байта 0CBh

Y DW 06AB7h

Z DD 0FAFBFEFFh

YYY DD 0FFFFFFFFh

N DB 168

M DB ? ; Неинициализированный байт

MM DW 10 dup (?) ; 10 неинициализированных слов

MMW DW 10 dup (0FFFFh) ; 10 инициализированных

; слов

MMB DB 10 dup (0CCh) ; 10 инициализированных байт

digits DB '0123456789' ; Строка с цифрами

D ENDS ; Конец сегмента

; Сегмент кода

C SEGMENT

ASSUME SS:S,CS:C, DS:D

MMM PROC FAR

; Выполнение соглашений DOS и настройка регистра DS

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, D

MOV DS, AX

; Пересылка непосредственного операнда в регистр

; (размер пересылаемого задает первый операнд)

MOV AX, 0234h ; Пересылка слова

; MOV BL, 600 Ошибочная команда

; ассемблер выдает

;сообщение "error A2050: Value out of range",

; т.к. число 600 не помещается в байт

MOV DL, 17 ; Пересылка байта

MOV CH, 34 ; Пересылка байта

MOV SI, 234 ; Пересылка слова

; MOV DS, 234 Ошибка: команды пересылки

; непосредственного операнда

; в сегментный регистр не существует

; Пересылка непосредственного операнда в память

;(размер пересылаемого задает первый операнд)

MOV X, 34h ; Байт

MOV MM, 1722h ; Слово

MOV MM+3, 34CCh ; Слово со смещением 3 байта

; от начала переменной

MOV MMW+2, 0 ; Слово со смещением 2 байта

; от начала переменной

MOV MMB, 0 ; Байт

; Пересылка из регистра в регистр

;(размеры операндов должны совпадать)

MOV DI, SI ; Слово

MOV DH, DL ; Байт

MOV ES, SI ; Слово

; MOV CS, SI Ошибка – в CS находится

;адрес сегмента кода

MOV X, DH ; Байт

MOV MM, DS ; Слово

MOV MM+4, AX ; Слово со смещением 4 байта

; от начала переменной

; Пересылка из памяти в регистр

; (размеры операндов должны совпадать)

MOV DI, MM ; Слово

MOV DH, X+1 ; Байт

MOV ES, MM+2 ; Слово

; Примеры использования оператора PTR

;(явное преобразование типа переменной)

MOV AX, WORD PTR X

MOV BL, BYTE PTR MM

; Возврат в DOS и окончание работы программы

RET ;Возврат в DOS

MMM ENDP ;Конец процедуры MMM

C ENDS ;Конец сегмента

END MMM ;Конец программы.

Пример 3. Программа иллюстрации возникновения переноса и переполнения при выполнении команд сложения и вычитания.

; Сегмент стека

S SEGMENT STACK

DW 64 DUP (?)

S ENDS

; Сегмент данных отсутствует, т.к. в программе нет переменных

; Сегмент кода

C SEGMENT

ASSUME SS:S,CS:C, DS:D

MMM PROC FAR

; Выполнение соглашений DOS и настройка регистра DS

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, D

MOV DS, AX

; Команды, не вызывающие установку флагов

MOV AX, 32

ADD AX, 32

MOV BX, 16

SUB AX, BX

SUB AX, BX

; Переполнение при сложении

SUB AX, AX ; Очистка AX, флаг ZF = 1

MOV AL, 7Ch ; 124 (01111100) - почти максимальное

;положительное число формата байт

ADD AL, 3 ; 127, 01111111

ADD AL, 2 ; = 129 без знака = –127 со знаком

; 10000001 - переполнение (OF = 1,

; SF = 1)

; Перенос при сложении

MOV AH, 0FAh ; Пересылки значений флагов

; не меняют

ADD AH, 3 ;SF = 1 (старший бит - 1)

ADD AH, 3 ;CF = 1 (сумма не поместилась

; в 8 бит). ZF = 1

; Перенос при вычитании (11 – 13 = –1)

MOV CX, 12

SUB CX, 1 ; Сброс всех флагов: 12 – 1 = 11

; (не 0, положит., переноса и

; переполнения нет)

SUB CX, 13 ; CF = 1 и SF = 1 (старший бит - 1)

; Переполнение при вычитании

; 127 - (-3) = 130, в 7 битах не поместится

; и окажется = –126 (127-253,

; если рассматривать как число без знака)

MOV DL, 127

MOV CL, -3

SUB DL, CL ; OF = 1, CF = 1, SF = 1

; Возврат в DOS и окончание работы программы

RET

MMM ENDP

C ENDS

END MMM

Отчет по лабораторной работе

Отчет по лабораторной работе следует писать по ходу выполнения ЛР от руки либо на отдельных листах, либо непосредственно в контрольной работе (рядом с решением и/или с оборотной стороны листов). В каждом задании указывается, какие именно данные должны быть внесены в отчет.

Порядок выполнения работы

Задание 1 (20 минут). Изучить структуру простейшей ассемблерной программы.

1. Скопировать на рабочий компьютер папку asm_lab1. В ней находятся:

– ассемблер (MASM.exe), редактор связей (LINK.exe) и отладчик (AFD.com).

– текст первой программы (skelet.asm), содержащей пример типичной программы на ассемблере с подробными комментариями. Программа выводит на экран монитора прив–тствие.

– примеры командных файлов для формирования загрузочного модуля.

– примеры программ.

2. Просмотреть в текстовом редакторе исходный код программы skelet.asm, внимательно изучить комментарии.

Обратить внимание на то:

– как оформляются сегменты (директивы SEGMENT и ENDS с одинаковым именем);

– как указано, что сегмент с именем S – это сегмент стека (параметр STACK)

– что сегмент стека рекомендуемого минимального размера должен существовать в любой программе, даже если реализация алгоритма не предусматривает его использование (и в коде программы нет операторов, непосредственно обращающихся к стеку;

– как программист сообщает ассемблеру, по какому сегментному регистру следует базировать тот или иной сегмент (директива ASSUME);

– что код оформлен в виде процедуры, которая будет вызываться из MS DOS (директивы PROC и ENDP с одинаковым именем);

– что точка входа (команда, с которой будет начато выполнение модуля) указывается в директиве ENDP;

– что для обеспечения корректного возврата в DOS процедура начинается с сохранения в стеке содержимого регистра DS и записи в него 0.

– что для корректного выполнения программы все указанные в директиве ASSUME сегментные регистры должны содержать базовые адреса соответствующих сегментов в ОП. При этом регистры CS и SS настраиваются системой и на момент входа в нашу программу содержат корректные значения, а вот регистр DS программист на ассемблере настраивает самостоятельно (и, конечно, после сохранения в стеке исходного значения DS).

3. Данную программу следует использовать в дальнейшем как основу для разработки своих программ. Сохраняя структуру (скелет), можно менять данные и команды на свои, соответствующие тому или иному заданию.

Задание 2 (20 минут). Научиться создавать загрузочный модуль программы с помощью ассемблера MASM и редактора связей LINK.

1. Просмотреть командный файл make_skelet.bat, предназначенный для формирования загрузочного модуля программы skelet.asm.

Команда masm skelet запускает ассемблер MASM с входным файлом skelet.asm. В ответ на запросы пользователь может указать имена файлов для загрузочного модуля (тип obj), листинга (тип lst) и файла перекрестных ссылок (тип crf). По умолчанию (на все запросы просто нажимаем клавишу enter) создается объектный файл с тем же именем, что и исходный, а листинг и файл перекрестных ссылок не создаются.

Команда link skelet запускает редактор связей LINK. Он в свою очередь запрашивает имя загрузочного модуля, листинга, дополнительных библиотек.

Команда pause – это просто задержка. Интерпретатор команд перейдет к выполнению следующей команды только после того, как пользователь нажмет любую клавишу. В данном случае pause не позволяет сразу закрыться окну интерпретатора, давая возможность просмотреть сообщения ассемблера и редактора.

2. Запустить командный файл make_skelet.bat. В ответ на все запросы нажимать клавишу «Enter». Ассемблер выведет сообщения о количестве ошибок и предупреждений (должно быть 0 и 0). Будут сформированы объектный (skelet.obj) и исполняемый (skelet.exe) файлы.

3. Выполнить программу, запустив exe-файл. Исполняемый файл запускают с помощью командного файла, включив в него команду задержки выполнения «pause», чтобы увидеть в окне интерпретатора результаты выполнения программы. Программа должна пропищать и вывести приветствие.

4. Если при ассемблировании возникают ошибки, удобнее анализировать их по листингу. В качестве наглядного примера можно добавить в программу любую ошибку и снова запустить ассемблер, указав в ответ на запрос об имени файла-листинга произвольное имя. Будет сформирован листинг с диагностическим сообщением рядом с ошибочной командой. Можно использовать стандартное средство поиска для навигации по листингу (error – ошибка, warning - предупреждение). При отладке программ по ходу лабораторного практикума рекомендуется формировать листинг для анализа ошибок.

Задание 3 (20 минут). Освоить работу в интерактивном отладчике AFD.com.

Отладчик поддерживает пошаговое выполнение программы, отображая при этом содержимое регистров процессора, значения флагов, а также содержимое заказанных фрагментов памяти и последних четырех слов стека. В таблице приведены некоторые команды и функциональные клавиши для работы в отладчике. Дополнительную информацию можно получить, нажав функциональную клавишу F4 (Help).

Окно интерактивного отладчика приведено на рис. 24.

Рис. 24. Окно интерактивного отладчика AFD.com

Команды и функциональные клавиши для работы с отладчиком AFD приведены в табл. 7.

Таблица 7

Команды и функциональные клавиши для работы

с отладчиком

Команда

Назначение

L skelet

Загрузить файл skelet.exe

Quit

Выход из отладчика

F2

Пошаговое выполнение без входа в процедуры

F1

Пошаговое выполнение, в том числе внутри процедур

F3

Просмотр (возврат в командное поле) ранее выполненных команд

Продолжение табл. 7

F7, F8, F9, F10

Переход в режим непосредственного редактирования содержимого регистров и памяти. Клавиши перемещают курсор с панели на панель соответственно вверх, вниз, влево и вправо. Перемещение внутри панели производится клавишами управления курсором. Для выхода обратно в командный режим следует переместить курсор в поле команд.

G

Непошаговое выполнение программы.

R AX = ab7d

Запись значения в регистр. В приведенном примере – значения ab7d в регистр AX.

ZF = 1

Присвоить значение флагу условия, в данном случае – флагу нуля.

M 1 SS:40

M 2 DS:0

Отобразить на первой панели памяти содержимое сегмента стека, начиная со смещения 40

Отобразить на второй панели памяти содержимое сегмента данных с начала (смещение 0)

1. Запустить отладчик (двойным щелчком), загрузить программу skelet.exe (введя команду L skelet) и начать ее пошаговое выполнение (клавиши F1 и F2). Обратить внимание на следующие моменты:

– на исходные (до выполнения команд) значения и пошаговые изменения счетчика команд (регистр IP) и указателя стека (регистр SP).

– на то, что данные, определенные в сегменте данных программы, появляются на панели памяти только после загрузки базового значения в сегментный регистр DS, т.е. после выполнения пятой команды программы.

2. Отобразить на второй панели памяти содержимое сегмента стека. Начало сегмента будет выведено по команде M 2 SS:0. Однако стек начинает заполняться с его дна, т.е. с наибольших адресов. Чтобы увидеть записанные в стек данные, используйте команду M 2 SS:40. Вернитесь к отображению сегмента данных.

3. Проследить изменение состояния регистров (DS, AX и DX) в результате выполнения команд пересылок.

4. Достигнув команды программного прерывания INT, прекратите пошаговое выполнение (иначе отладчик пойдет внутрь программ обработки прерываний). Чтобы выполнить программу до конца, выполните команду G.

Задание 4 (30 минут). Проверить правильность выполнения первого задания второй части контрольной работы.

Для этого следует скопировать программу skelet.asm, создать в ней переменные, инициализированные константами из Вашего варианта, скомпоновать модуль и загрузить его в отладчик. Найти на панели памяти соответствующие представления, записать их в отчет по ЛР (можно прямо в контрольной работе, рядом с результатами задания 1, чтобы было удобно сравнивать). Не забывать о том, что Ваши данные отобразятся на панели только после того, как будут выполнены команды загрузки соответствующего базового адреса в сегментный регистр DS.

Показать результаты преподавателю (на экране и в отчете).

Задание 5 (45 минут). Проверить правильность выполнения третьего задания второй части контрольной работы (директивы описания данных и команды пересылки).

1. Создать и отассемблировать программу, содержащую Ваше решение. Программу разработать на основе любой уже работающей, содержащей корректное оформление сегментов и т.д.

2. Добиться, чтобы ассемблер не выдавал сообщений об ошибках и предупреждений.

3. Собрать загрузочный модуль и запустить в отладчике. Пошагово выполнить программу, проверить корректность своего решения. При необходимости исправить программу, снова отассемблировать и проверить в отладчике.

4. Исправить решение в контрольной работе, если в нем были ошибки.

5. В отчет внести дамп сегмента данных до выполнения пересылок и после всех пересылок (дамп – содержимое памяти в 16-ном представлении). В итоговом варианте выделить изменившиеся байты.

6. Для каждой команды пересылки указать данные какого типа (байт или слово) пересылаются, а также содержимое приемника после пересылки.

7. Показать результаты преподавателю (на экране и в отчете).

Задание 6 (45 минут). Проверить правильность выполнения четвертого задания второй части контрольной работы (сложение и вычитание).

1. Создать и отассемблировать программу, содержащую Ваше решение. Программу разработать на основе любой уже работающей, содержащей корректное оформление сегментов и т.д. Добиться, чтобы ассемблер не выдавал сообщений об ошибках и предупреждений.

2. Собрать загрузочный модуль и запустить в отладчике. Пошагово выполнить программу, проверить корректность своего решения (Те ли флаги устанавливаются, которые Вы ожидали?). При необходимости исправить программу, снова отассемблировать и проверить в отладчике.

3. Исправить решение в контрольной работе, если в нем были ошибки (команды и/или значения флагов).

4. Приготовится объяснить преподавателю, какие флаги и почему устанавливаются при выполнении Вашей программы.

5. Показать результаты преподавателю (на экране и в отчете).