Разработка виртуальных лабораторных работ средствами эмулятора Emu8086

Виртуальный лабораторный практикум в инженерном образовании. Особенности лабораторного практикума для естественнонаучных дисциплин. Программный эмулятор (виртуальный ПК) Emu8086. Вывод значения байта в десятеричной системе счисления, методика выполнения.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 09.07.2010
Размер файла 430,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

1.4 Особенности создания ассемблерной программы в среде эмулятора EMU8086

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

Пакет Emu8086 сочетает в себе продвинутый текстовый редактор, assembler, disassembler, эмулятор программного обеспечения (Виртуальную машину) с пошаговым отладчиком, примеры.

В процессе выполнения программы мы можем наблюдать программные регистры, флаги и память, АЛУ показывает работу центрального процессора.

Встроенная виртуальная машина полностью блокирует обращение программы к реальным аппаратным средствам ЭВМ, накопителям памяти, это делает процесс отладки намного более легкой

1.5 Правила оформления ассемблерных программ

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

директивы набирайте большими буквами, инструкции - малыми;

пишите текст широко - не скупердяйничайте;

не выходите за край экрана, т.е. не делайте текст шире 80 знаков - его не удобно будет редактировать и печатать;

для отступов пользуйтесь табуляцией (клавиша TAB);

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

<TAB><TAB>mov<TAB>ax,<пробел>bx< (1-3) TAB>; <пробел>текст комментария

Количество табуляций перед комментарием определяется длиной аргументов команды и может быть от 1 до 3. По мере знакомства с синтаксисом языка будут приводиться дополнительные правила.

2. Задание для выполнения

2.1 Запустить эмулятор EMU8086.

2.2 Пользуясь правилами оформления ассемблерных программ, исправьте слова "Please Register." на любые понравившиеся (Не забудьте заключить их в апострофы).

2.3 Запустите приложение, нажав кнопку `Emulate' или клавишу F5.

2.4 Запустите полученный код на выполнение, используя кнопку “RUN” или нажмите функциональную клавишу F9.

2.5 Откомпилируйте программу. Вернитесь в главное окно формы, предварительно закрыв все открытые окна, далее нажмите кнопку “Compile”.

2.6 Полученный com-файл запустите во встроенной командной строке WINDOWS 98 на выполнение или запустите сеанс dos в total commander'e.

2.7 Поэкспериментируйте с другими примерами которые открываются при нажатие клавиши “Samples” в главном окне эмулятора.

2.8 Ознакомитесь со встроенной в эмулятор EMU8086 справкой. В ней содержится вся необходимая информация для работы с программой, азы написания программ на языке assembler и др.

3. Контрольные вопросы

3.1 Каковы основные отличия ассемблерных программ от ЯВУ?

3.2 Какова структура ассемблерной программы?

3.3 В чем отличие инструкции от директивы?

3.4 Каковы правила оформления программ на языке ассемблера?

3.5 Каковы этапы получения выполняемого файла?

3.6. Для чего нужен этап отладки программы?

3.7. Опишите основные моменты создания исполняемого файла и эмуляции работы программы?

3.8. Каковы шаги технического создания ассемблерной программы в программах TASM и MASM?

3.9 Основные возможности эмулятора EMU8086?

3.10 Методы борьбы с зависанием в DOS'e?

Лабораторная работа № 2

РАЗРАБОТКА ПЕРВОЙ ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА

Цель работы: Знакомство со структурой ассемблерной программы, создание первой программы на языке ассемблера.

Структура ассемблерной программы

Чтобы программа выполнилась любой ОС, она должна быть скомпилирована в исполнимый файл. Основные два формата исполнимых файлов в DOS - СОМ и ЕХЕ.

Файлы типа СОМ содержат только скомпилированный код без какой-либо дополнительной информации о программе Весь код, данные и стек такой полагаются в одном сегменте и не могут превышать 64 Кб.

. model tiny

. code

org 100h

begin:

mov ah, 9

mov dx,offset message

int 21h

ret

message db "Привет", 0dh, 0ah, '$'

end begin

Рассмотрим исходный текст программы, чтобы понять, как она работает.

Первая строка определяет модель памяти TINY, в которой сегменты кода, данных и стека объединены. Эта модель предназначена для создания файлов типа СОМ.

В DOS для формирования адреса используется сегмент и смещение. Для формирования адреса строки "ПРИВЕТ" используется пара регистров DS (сегмент) и DX (смещение). При загрузке *.com-программы в память, все сегментные регистры принимают значение равное тому сегменту, в который загрузилась наша программа (в т. ч. и DS). Поэтому нет необходимости загружать в DS сегмент строки (он уже загружен).

Директива. CODE начинает сегмент кода, который в нашем случае также должен содержать и данные.

ORG 100h устанавливает значение программного счетчика (IP) в 100h, потому что при загрузке СОМ-файла в память DOS занимает первые 256 байт (100h) блоком данных PSP и располагает код программы только после этого блока. Все программы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.

Метка BEGIN: располагается перед первой командой в программе и будет использоваться в директиве END (Begin - англ. начало; end - конец), чтобы указать, с какой команды начинается программа.

Вообще вместо слова BEGIN можно было бы использовать что-нибудь другое. Например, START:. В таком случае, нам пришлось бы и завершать программу END START.

Строки (5) - (7) выводят на экран сообщение “ПРИВЕТ”.

Рассмотрим вкратце о регистрах процессора.

Регистр процессора - это специально отведенная память для хранения какого-нибудь числа.

Например:

Если мы хотим сложить два числа, то в математике запишем так:

A=5

B=8

C=A+B.

A, B и C - это своего рода регистры (если говорить о компьютере), в которых могут хранится некоторые данные. А=5 можно прочитать как: Присваиваем А число 5.

Для присвоения регистру какого-нибудь значения, в Ассемблере существует оператор mov (от англ. move - загрузить). Команда MOV АН,9 помещает число 9 в регистр АН - номер функции DOS "вывод строки".

Команда MOV DX, OFFSET MESSAGE помещает в регистр DX смещение метки MESSAGE относительно начала сегмента данных, который в нашем случае совпадает с сегментом кода.

OFFSET (по-английски - это смещение). Когда, при ассемблировании, Ассемблер дойдет до этой строки, он заменит OFFSET MESSAGE на АДРЕС (смещение) этой строки в памяти. Если мы запишем OFFSET MESSAGE (хотя, правильнее будет MOV DX, WORD OFFSET MESSAGE), то в DX загрузится не адрес (смещение), а первые два символа нашей строки (в данном случае "Пр"). Так как DX - шестнадцатиразрядный регистр, в него можно загрузить только два байта (один символ всегда один байт).

Команда INT 21H вызывает системную функцию DOS (int от англ. interrupt - прерывание). Можно заменить строку INT 21H на INT 33, программа будет работать корректно. Однако в Ассемблере принято указывать номер прерывания в шестнадцатеричной системе.

Прерывание MS-DOS - это своего рода подпрограмма (часть MS-DOS), которая находится постоянно в памяти и может вызываться в любое время из любой программы.

Эта команда - основное средство взаимодействия программ с операционной системой. В примере вызывается функция DOS номер 9 - вывести строку на экран. Эта функция выводит строку от начала, адрес которого задается в регистрах DS: DX, до первого встречного символа $. При запуске СОМ-файла регистр DS автоматически загружается сегментным адресом программы, а регистр DX был подготовлен предыдущей командой.

Рассмотрим вышесказанное на примере (мелким шрифтом выделим примечания):

Программа сложения двух чисел

Начало программы

A=5 в переменную A заносим значение 5

B=8 в переменную B значение 8

Вызов подпрограммы Сложение

теперь С равно 13

A=10 тоже самое, только другие числа

B=25

Вызов подпрограммы Сложение

теперь С равно 35

Конец Программы

Подпрограмма Сложение

C=A+B

Возврат из подпрограммы возвращаемся в то место, откуда вызывали

Конец подпрограммы

В данном примере мы дважды вызвали подпрограмму Сложение, которая сложила два числа, переданные ей в переменных A и B. Результат помещается в переменную С. Когда вызывается подпрограмма, компьютер запоминает с какого места она была вызвана, а затем, когда закончила работу подпрограмма, компьютер возвращается в то место, откуда она вызывалась. Т.о. можно вызывать подпрограммы неопределенное количество раз с любого места.

Команда RET пользуется обычно для возвращения из процедуры. DOS вызывается COM-программы так, что команда RET корректно завершает программу.

DOS при вызове СОМ-файла помещает в стек сегментный адрес программы и ноль, так что RET передает управление на нулевой адрес текущего сегмента, то есть на первый байт PSP. Там находится код команды INT 20H, которая и используется для возвращения управления в DOS. Можно сразу заканчивать программу командой INT 20h, хотя это длиннее на 1 байт.

Следующая строка примера определяет строку данных, содержащую текст “ПРИВЕТ" управляющий символ ASCII возврат каретки с кодом ODh, управляющий символ ASCII перевод строки с кодом 0Ah и символ $ завершающий строку (если мы его уберем, то 21h прерывание продолжит вывод до тех пор, пока не встретится где-нибудь в памяти символ $, на экране мы увидим “мусор). Первое слово (message - сообщение) - название сообщения. Оно может быть любым (например, mess или string и пр).

Управляющие символы (ODh и 0Ah) переводят курсор на первую позицию следующей строки.

Директива END завершает программу, одновременно указывая, с какой метки должно начинаться ее выполнение.

В качестве дополнительного примера создадим еще одну строку, которую назовем message1. Затем, начиная со строки (9) вставим следующие команды и скомпилируем программу заново.

9

mov dx,offset message1

10

int 21h

11

int 20h

12

message db "Привет", 0dh, 0ah, '$'

13

message1 db "Группа", 0dh, 0ah, '$'

14

end begin

2. Задание для выполнения

2.1 Запустить эмулятор EMU8086.

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

2.3 Откомпилируйте пример №2;

2.4 Вернитесь в главное окно формы, предварительно закрыв все открытые окна, далее нажмите кнопку “Compile".

2.5 Полученный com-файл запустите в сеансе dos.

2.6 Создайте на языка Pascal программу выводящую на экран слово “Привет" и сравните размеры получаемых файлов (Pascal и Assembler).

3. Контрольные вопросы

3.1 Характеристика структуры файла типа *.com?

3.2 Какова структура ассемблерной программы?

3.3 С какой целью в код программы на ассемблере для DOS вводится строка ORG 100h?

3.4 Назначение команды MOV?

3.5 Прерывания 21h и 20h. Назначение?

3.6 Сущность и целесообразность использования команды RET вместо прерывания 20h?

3.6. Символ `$' методика применения?

3.7. Связка “BEGIN: - END BEGIN". Правила применения?

ЛАБОРАТОРНАЯ РАБОТА №3

СТРУКТУРА ИСПОЛНИМЫХ ФАЙЛОВ ТИПА *. EXE.

ПРОСТЫЕ АРИФМЕТИЧЕСКИЕ ДЕЙСТВИЯ НА ЯЗЫКЕ АССЕМБЛЕРА

Цель работы: Изучение принципов составления простейших*. exe программ. Изучение приемов работы с простейшими операторами арифметических действий.

Краткие теоретические сведения (программа типа *. ЕХЕ).

Файлы типа ЕХЕ содержат заголовок, в котором описывается размер файла, требуемый объем памяти, список команд в программе, использующих абсолютные адреса, которые зависят от расположения программы в памяти, и т.д. ЕХЕ-файл может иметь любой размер. Формат ЕХЕ также используется для исполнимых файлов в различных версиях DOS-расширителей и Windows, но со значительными изменениями.

Операционная система DOS не использует расширения для определения типа файла. Первые два байта заголовка ЕХЕ-файла - символы "MZ" или "ZM", и если файл начинается с этих символов и длиннее некоторого порогового значения, разного для разных версий DOS, он загружается как ЕХЕ, если нет - как СОМ.

ЕХЕ-программы немного сложнее в исполнении, но для них отсутствует ограничение размера в 64 килобайта, так что все достаточно большие программы используют именно этот формат. Конечно, ассемблер позволяет уместить и в 64 килобайтах весьма сложные и большие алгоритмы, а все данные хранить в отдельных файлах, но ограничение размера все равно очень серьезно, и даже чисто ассемблерные программы могут с ним сталкиваться.

Простой пример ЕХЕ-файла:

. model small

; сегмент стека размером в 256 байт

. stack 100h

; сегмент стека размером в 256 байт

. code

; сегмент кода, который содержит и данные.

Begin:

; метка начала кода программы

mov ax,@data;

; сегментный адрес строки message помещается в DS

mov ds,ax

mov dx,offset string

помещает в регистр DX смещение метки String относительно начала сегмента данных

mov ah,9

; помещаем номер функции DOS "вывод строки (9)" в регистр АН.

int 21h

; функция DOS "вывод строки"

mov ax,4C00h

; завершение программы типа - exe

int 21h

; функция DOS "завершить программу"

. data

; начало сегмента данных

string db "Privet", 0Dh,0Ah,'$'

; cтрока с содержащая выводимые данные.

end begin

; метка окончания кода программы

В примере определяются три сегмента - сегмент стека директивой. STACK размером в 256 байт, сегмент кода, начинающийся с директивы. CODE, и сегмент данных, начинающийся с. DATA. При запуске ЕХE-программы регистр DS уже не содержит адреса сегмента со строкой string (он указывает на сегмент, содержащий блок данных PSP), а для вызова используемой функции DOS этот регистр должен иметь сегментный адрес строки. Команда MOV AX,@DATA загружает в АХ сегментный адрес группы сегментов данных @DATA, a MOV DS,AX копирует его в DS. Программы типа ЕХЕ должны завершаться системным вызовом DOS 4Ch: в регистр АН помещается значение 4Ch, в регистр AL помещается код возврата (в данном примере код возврата 0 и регистры АН и AL загружаются одной командой MOV AX,4C00h), после чего вызывается прерывание 21h.

Простые арифметические операторы.

Арифметические команды любого микропроцессора привлекают к себе наибольшее внимание. Каждый заинтересован в выполнении арифметических вычислений, и именно эти команды проделывают такую работу. Хотя их немного, они выполняют большинство преобразований данных, а микропроцессоре. В реальных же условиях арифметические команды занимают лишь малую часть всех исполняемых команд.

2.1 Сложение.

Команда ADD (Addition - сложение (гл. to add - сложить)) осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды ADD можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду ADD можно использовать для сложения как обычных целых чисел, так и двоично-десятичных (с использованием регистра АХ для хранения результата). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Команда

Назначение

Процессор

ADD приемник, источник

Сложение

8086

Примеры:

mov al,10 - --> загружаем в регистр AL число 10

add al,15 - --> al = 25; al - приемник, 15 - источник

mov ax,25000 - --> загружаем в регистр AX число 25000

add ax,10000 - --> ax = 35000; ax - приемник, 10000 - источник

mov cx, 200 - --> загружаем в регистр CX число 200

mov bx,760 - --> а в регистр BX - 760

add cx,bx - --> cx = 960, bx = 760 (bx не меняется); cx - приемник, bx - источник

2.2 Вычитание.

Команда SUB (Subtraction - вычитание) вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде

SUB операнд1, операнд2

то ее действие можно условно изобразить следующим образом:

операнд1 - операнд2 - > операнд1

В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Команда

Назначение

Процессор

SUB приемник, источник

Вычитание

8086

Примеры:

mov al,10

sub al,7 - --> al = 3; al - приемник, 7 - источник

mov ax,25000

sub ax,10000 - --> ax = 15000; ax - приемник, 10000 - источник

mov cx,100

mov bx,15

sub cx,bx - --> cx = 85, bx = 15 (bx не меняется); cx - приемник, bx - источник

2.3 Инкремент (увеличение на 1).

Команда INC (Increment - инкремент) прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово.

Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF. Команда не воздействует на флаг CF; если требуется воздействие на этот флаг, необходимо использовать команду Add Op,l.

Команда INC (Increment - инкремент) увеличивает на единицу регистр или значение операнда в памяти.

Она эквивалентна команде ADD источник, 1 только выполняется гораздо быстрее.

Команда

Назначение

Процессор

INC приемник

Увеличение на единицу

8086

Примеры:

mov al,15

inc al - --> теперь AL = 16 (эквивалентна add al,1)

mov dh,39h

inc dh - --> DH = 3Ah (эквивалентна add dh,1)

mov cl,4Fh

inc cl - --> CL = 50h (эквивалентна add cl,1)

2.4 Декремент (уменьшение на 1).

Команда DEC (Decrement - декремент) вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF.

Она эквивалентна команде SUB источник, 1 только выполняется гораздо быстрее.

Команда

Назначение

Процессор

INC приемник

Увеличение на единицу

8086

Примеры:

mov al,15

dec al - --> теперь AL = 14 (эквивалентна sub al,1)

mov dh,39h

dec dh - --> DH = 38h (эквивалентна sub dh,1)

mov cl,4Fh

dec cl - --> CL = 4Dh (эквивалентна sub cl,1)

3. Задание для выполнения.

3.1 Запустить эмулятор EMU8086.

3.2 Получите задание у преподавателя (один из пяти вариантов табл. №1) и, пользуясь правилами оформления ассемблерных программ, напишите программы расчета значения A (два-три варианта).

2.3 Программу ассемблируйте в файл типа *. exe;

3. Контрольные вопросы

3.1 Структура файлов типа *. exe?

3.2 Структурные отличия файлов *. exe от *.com в операционной среде DOS?

3.3 Команда add основное назначение?

3.4 Команда sub основное назначение?

3.5 Команда inc основное назначение?

3.6. Команда dec основное назначение?

Табл. №1

вар.

Расчетная формула

B

C

D

A=B+C-D

1

35

23

A=B+C+D

65

1

1

A=C-D+B

1

33

1

A=D+A-B

18

1

88

A= B-C+D

45

10

1

По согласованию с преподавателем можно изменить как расчетную формулу, так и значения коэффициентов (B, C, D).

Лабораторная работа № 3

СПОСОБЫ АДРЕСАЦИИ НА ЯЗЫКЕ АССЕМБЛЕРА

Цель работы: Изучить основные способы адресации.

Способы адресации.

Способом, или режимом адресации называют процедуру нахождения операнда для выполняемой команды. Если команда использует два операнда, то для каждого из них должен быть задан способ адресации, причем режимы адресации первого и второго операнда могут, как совпадать, так и различаться. Операнды команды могут находиться в разных местах: непосредственно в составе кода команды, в каком-либо регистре, в ячейке памяти; в последнем случае существует несколько возможностей указания его адреса. Строго говоря, способы адресации являются элементом архитектуры процессора, отражая заложенные в нем возможности поиска операндов. С другой стороны, различные способы адресации определенным образом обозначаются в языке ассемблера и являются разделом языка.

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

В архитектуре современных 32-разрядных процессоров Intel предусмотрены довольно изощренные способы адресации; в МП 86 способов адресации меньше. Мы в настоящей лабораторной работе ознакомимся с режимами адресации, используемые в МП 86.

Различают следующие режимы адресации:

регистровый;

непосредственный;

прямой;

регистровый косвенный (базовый или индексный);

регистровый косвенный со смещением (базовый или индексный);

базово-индексный;

базовый индексный со смещением.

1.1 Регистровый режим

Значение операнда-источника предварительно запоминается в одном из встроенных регистров микропроцессора.

Сам регистр становится эффективным адресом. Операнд (байт или слово) находится в регистре. Этот способ применим ко всем программно-адресуемым регистрам процессора:

inc CX

; Увеличение на 1 содержимого CX

push DS

; Сегментный адрес сохраняется в стеке

xchg BX,BP

; Регистры BX и BP обмениваются содержимым

mov ES,AX

; Содержимое AX пересылается в ES

1.2 Непосредственный режим

Непосредственная адресация. Операнд (байт или слово) указывается в команде и после трансляции поступает в код команды; он может иметь любой смысл (число, адрес, код ASCII), а также быть представлен в виде символического обозначения.

mov АН, 40h

; Число 40h загружается в АН

mov AL,'*'

; Код ASCII символа "*' загружается в AL

int 21h

; Команда прерывания с аргументом 21h

limit equ 528

; Число 528 получает обозначение limit

mov CX,limit

; Число, обозначенное limit, загружается в СХ

Команда mov, использованная в последнем предложении, имеет два операнда; первый операнд определяется с помощью регистровой адресации, второй - с помощью непосредственной.

Важным применением непосредственной адресации является пересылка относительных адресов (смещений), для этого используется описатель offset (смещение):

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

string db “Privet"; Строка символов

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

mov DX,offset string; Адрес строки засылается в DX

1.3 Прямой режим.

Адресуется память; адрес ячейки памяти (слова или байта) указывается в команде (обычно в символической форме) и поступает в код команды:

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

meml dw 0; Слово памяти содержит 0

mem2 db 230; Байт памяти содержит 230

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

inc meml; Содержимое слова meml увеличивается на 1

mov DX, meml; Содержимое слова с именем menu загружается в DX

mov AL,mem2; Содержимое байта с именем mem2 загружается в АL

Сравнивая этот пример с предыдущим, мы видим, что указание в команде имени ячейки памяти обозначает, что операндом является содержимое этой ячейки; указание имени ячейки с описателем offset - что операндом является адрес ячейки.

Прямая адресация памяти на первой взгляд, кажется, простой и наглядной. Если мы хотим обратиться, например, к ячейке meml, мы просто указываем ее имя в программе. В действительности, однако, дело обстоит сложнее. Адрес любой ячейки состоит из двух компонентов: сегментного адреса и смещения. Обозначения meml и mem2 в предыдущем примере, являются смещениями. Сегментные же адреса хранятся в сегментных регистрах. Однако сегментных регистров четыре: DS, ES, CS и SS. Каким образом процессор узнает, из какого регистра взять сегментный адрес, и как сообщить ему об этом в программе?

Процессор различает группу кодов, носящих название префиксов. Имеется несколько групп префиксов: повторения, размера адреса, размера операнда, замены сегмента. Здесь нас будут интересовать префиксы замены сегмента.

Команды процессора, обращающиеся к памяти, могут в качестве первого байта своего кода содержать префикс замены сегмента, с помощью которого процессор определяет, из какого сегментного регистра взять сегментный адрес. Для сегментного регистра ES код префикса составляет 26h, для SS - 361i, для CS - 2Eh. Если префикс отсутствует, сегментный адрес берется из регистра DS (хотя для него тоже предусмотрен свой префикс).

В приведенном примере, по умолчанию, все данные адресуются через сегментный регистр DS, так что вместо inc meml можно было написать inc DS: mem. В случае замены сегментного регистра его обязательно нужно указывать явно:

inc ES: mem1

inc CS: mem2

Обращение к ячейке памяти по известному абсолютному адресу осуществляется следующим образом:

mov AL,DS: [17h]

Загрузка в AL содержимого ячейки со смещением 17h в сегменте, определяемом содержимым DS

1.4 Регистровый косвенный (базовый и индексный).

Адресуется память (байт или слово). Относительный адрес ячейки памяти находится в регистре, обозначение которого заключается в прямые скобки. В МП 86 косвенная адресация допустима только через регистры ВХ, ВР, SI и DI. При использовании регистров ВХ или ВР адресацию называют базовой, при использовании регистров SI или DI - индексной.

Если косвенная адресация осуществляется через один из регистров ВХ, SI или DI, то подразумевается сегмент, адресуемый через DS, поэтому при адресации через этот регистр обозначение DS: можно опустить:

mov es: [bx],'1' ЇЇЇЇ> mov [bx],'1'

Кстати, этот фрагмент немного эффективнее предыдущего в смысле расходования памяти. Из-за отсутствия в коде последней команды префикса замены сегмента он занимает на 1 байт меньше места.

Регистры ВХ, SI и DI в данном применении совершенно равнозначны, и с одинаковым успехом можно воспользоваться любым из них:

Не так обстоит дело с регистром ВР. Этот регистр специально предназначен для работы со стеком, и при адресации через этот регистр в режимах косвенной адресации подразумевается сегмент стека; другими словами, в качестве сегментного регистра по умолчанию используется регистр SS.

Обычно косвенная адресация к стеку используется в тех случаях, когда необходимо обратиться к данным, содержащимся в стеке, без изъятия их оттуда (например, если к эти данные приходится считывать неоднократно).

Обозначение этого способа адресации:

[BX]

(подразумевается DS: [BX])

[BP]

(подразумевается SS: [BP])

[SI]

(подразумевается DS: [SI])

[DI]

(подразумевается DS: [DI])

Использование базовой адресации, на первый взгляд, снижает эффективность программы, так как требует дополнительной операции - загрузки в базовый регистр требуемого адреса. Однако команда с базовой адресацией занимает меньше места в памяти (так как в нее не входит адрес ячейки) и выполняется быстрее команды с прямой адресацией (из-за того, что команда короче, процессору требуется меньше времени на ее считывание из памяти). Поэтому базовая адресация эффективна в тех случаях, когда по заданному адресу приходится обращаться многократно, особенно, в цикле. Выигрыш оказывается тем больше, чем большее число, раз происходит обращение по указанному адресу. С другой стороны, возможности этого режима адресации невелики, и на практике чаще используют более сложные способы.

Примеры:

mov SI, offset string

; В SI загружается относительный адрес ячейки string

mov AX, [SI]

; Содержимое ячейки string загружается в AX

inc [SI]

; Увеличиваться содержимое ячейки string

mov BX, [SI]

; Новое содержимое ячейки string загружается в BX

mov DI, SI

; Относительный адрес ячейки string копируется в DI

1.5 Регистровый косвенный режим со смещением (базовый и индексный).

Адресуется память (байт или слово). Относительный адрес операнда определяется, как сумма содержимого регистра BX, BP, SI или DI и указанной в команде константы, иногда называемой смещением. Смещение может быть числом или адресом. Так же, как и в случае базовой адресации, при использовании регистров BX, SI и DI подразумевается сегмент, адресуемый через DS, а при использовании ВР подразумевается сегмент стека и, соответственно, регистр SS.

смещение = {SP, BP, DI, SI, BX} + смещение из команды

Иногда можно встретиться с альтернативными обозначениями того же способа адресации, которые допускает ассемблер. Вместо, например, 4 [ВХ] можно с таким же успехом написать [ВХ+4], 4+ [ВХ] или [ВХ] +4. Такая неоднозначность языка ничего, кроме путаницы, не приносит, однако ее надо иметь в виду, так как с этими обозначениями можно столкнуться, например, рассматривая текст деассемблированной программы.

Рассмотрим теперь пример использования базовой адресации со смещением при обращении к стеку:

смещение = {SP, BP, DI, SI, BX} + смещение из команды

Здесь квадратные скобки [] - это тоже оператор. Он вычисляет адрес как сумму того, что находится внутри скобок с тем, что находится снаружи.

array db 0, 10, 20, 30, 40, 50, 60; Пусть в сегменте данных определен массив:

Последовательность команд:

mov BX,5

mov AL,array [5] ; загрузит в AL элемент массива с индексом 5, то есть 50.

Тот же результат будет получен и в таких последовательностях команд:

mov BX,offset array

mov AL,5 [BX]

или

mov AL, [BX] +5

mov AL, [BX+5]

1.6 Базово-индексный режим

Адресуется память (байт или слово). Относительный адрес операнда определяется, как сумма содержимого следующих пар регистров:

смещение [BX] [SI]

(подразумевается DS: смещение [BX] [SI])

смещение [BX] [DI]

(подразумевается DS: смещение [BX] [DI])

смещение [BP] [SI]

(подразумевается SS: смещение [BP] [SI])

смещение [BP] [DI]

(подразумевается SS: смещение [BP] [DI])

Во всех этих случаях можно также писать:

смещение [BX+SI]

[смещение +BX+SI]

[BX+SI] +смещение

Это чрезвычайно распространенный способ адресации, особенно, при работе с массивами. В нем используются два регистра, при этом одним из них должен быть базовый (ВХ или ВР), а другим - индексный (SI или DI). Как правило, в одном из регистров находится адрес массива, а в другом - индекс в нем, при этом совершенно безразлично, в каком что.

1.7 Базово-индексная адресация со смещением.

Адресуется память (байт или слово). Относительный адрес операнда определяется как сумма содержимого двух регистров и смещения.

Это способ адресации является развитием предыдущего. В нем используются те же пары регистров, но полученный с их помощью результирующий адрес можно еще сместить на значение указанной в команде константы. Как и в случае базово-индексной адресации, константа может представлять собой индекс (и тогда в одном из регистров должен содержаться базовый адрес памяти), но может быть и базовым адресом. В последнем случае регистры могут использоваться для хранения составляющих индекса.

Приведем формальный пример рассматриваемого режима адресации.

Пусть в сегменте данных определен массив из 24 байт

syms db 'ЙЦУКЕНГШЩЗХЪ'

db 'йцукенгшщзхъ'

Последовательность команд

mov BX,12mov SI,6

mov DL,syms [BX] [SI] ; загрузит в регистр DL элемент с индексом 6 из второго ряда, то есть код ASCII буквы г

Тот же результат будет получен и в таком варианте:

mov BX,offset syms

mov SI,6

mov DL,12 [BX] [SI]

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

1. С помощью редактора эмулятора EMU 8086 напишите программу, исходный текст которой приводится в листинге №1:

2. Создайте исполняемый файл типа MZ.

3. Изучите структуру программы, также изучите структуру сегмента данных программы: найдите в нем все переменные, определенные в тексте программы.

4. Переделайте программу с использованием упрощенных директив сегментации так, чтобы получить исполняемый файл типа.com и сравните размеры программ.

5. Выполните первые 5 шагов программы, анализируя и записывая состояние регистров на каждом шаге.

6. Занесите в СХ 00FFh. Определите по способу адресации ячейку памяти в сегменте, где произойдут изменения, записать ее адрес.

7. Выполните дальнейшие шаги программы, анализируя возможные способы адресации.

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

9. В отчете должны содержаться ответы на следующие вопросы.

3. Контрольные вопросы

Как переслать содержимое X в Y?

Чем отличаются команды

MOV [si], cx

и

MOV si, cx?

К какому способу адресации относится команда MOV dx, offset message?

Какие сегменты используются при следующих вариантах адресации: [BX] [SI], [BX] [DI], [BP] [SI], [BP] [DI] ?

5. Что произойдет при выполнении инструкции

MOV AL, DS: 17h?

Чем эта команда отличается от следующей:

MOV AL, DS: [17h] ?

6. Пусть в сегменте данных определен массив

Array db 0,15,22,31,44,45,62,67,76,99

Что окажется в регистре AL после выполнения команд:

MOV BX, 5

MOV AL, array [BX] ?

7. Какой это способ адресации (пример вопроса 6)?

8. Укажите, какие инструкции в программе (листинг №1), созданной в данной лабораторной работе, относятся к инструкциям:

с непосредственным;

косвенным режимом адресации?

9. Укажите способ записи обращения напрямую к ячейке памяти по известному абсолютному адресу?

10. Префиксы, Виды префиксов. Префиксы замены сегмента?

11. Перечислите регистры косвенной и базовой адресации. Опишите отличия?

12. Сущность эффективности базовой адресации в сравнении с прямой?

Листинг №1.

TITLE MOVE2 MOVE2 SEGMENT 'CODE' ASSUME CS: MOVE2, DS: DATA MYPROC PROC OUTPROC:

MOV AX,DATA MOV DS,AX MOV AH,BH MOV AH,X MOV CH,3 MOV AX,3 MOV AX,Y MOV [SI],CX MOV [BP],CX MOV [SI],258 MOV [BP+516],1027 MOV BYTE PTR X,255 MOV BYTE PTR [DI+515],4 MOV WORD PTR [DI+515],4 MOV [DI+BP+515],258 MOV AX, [SI+BX+258] MOV AH,4CH INT 21H MYPROC ENDP MOVE2 ENDS DATA SEGMENT X DB 1 Y DW 2 DATA ENDS END MYPROC

ЛАБОРАТОРНАЯ РАБОТА № 5,6

ВЫВОД НА ЭКРАН В ТЕКСТОВОМ РЕЖИМЕ

Цель работы: Ознакомится с основными средствами вывода текстовых данных на экран посредством средств операционной системы DOS, средствами BIOS и средствами непосредственного (прямого) отображением в видеобуфер.

Средства DOS.

1.1 Функция DOS 02h.

Функция DOS 02h - Записать символ в STDOUT с проверкой на Ctrl-Break

Ввод:

АН = 02h

DL = ASCII-код символа

Вывод:

Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h).

Эта функция при выводе на экран обрабатывает некоторые управляющие символы - вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.

Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое по умолчанию осуществляет выход из программы.

Простой пример работы функции DOS 02h.

Пример № 1.1

. model tiny

; модель памяти в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov dl,< ASCII-код символа >

; заносим в регистр dl - любой ASCII-код символа

mov ah,2

; номер функции DOS "вывод символа"

int 21h

; вызов DOS

ret

; функция DOS "завершить программу"

end begin

; метка окончания кода программы

Эта программа, выводит на экран любой ASCII-символ, в установленную позицию курсора.

Все функции DOS вывода на экран используют устройство STDOUT, стандартный вывод. Это позволяет перенаправлять вывод программы в файл или на стандартный ввод другой программы. Например, если откомпилировать приведен пример (создать файл cod.com) и написать в командной строке

cod.com > cod. out

то на экран ничего выдано не будет, а в текущем каталоге появится файл cod. out, содержащий ASCII-код символа.

Функция DOS 06h.

Функция DOS 06h - Записать символ в STDOUT без проверки на Ctrl-Break

Ввод:

АН = 06h

DL = ASCII-код символа (кроме FFh)

Вывод:

Никакого, согласно документации, но на самом деле: AL = код записанного символа (копия DL)

Эта функция не обрабатывает управляющие символы (CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl-Break.

Заменим в примере № 1.1 MOV АН,2 на MOV АН,6 и перекомпилируем этот пример. Работу откомпилированного примера смотрим в операционной системе MS-DOS.

Функция DOS 09h

Функция DOS 09h - Записать строку в STDOUT с проверкой на Ctrl-Break

Ввод:

АН = 09h DS: DX = адрес строки, заканчивающейся символом $ (24h)

Вывод:

Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа)

Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка (смотри лабораторную работу №2).

1.4 Функция DOS 40h

Функция DOS 40h - Записать в файл или устройство

Ввод:

АН = 40h ВХ = 1 для STDOUT или 2 для STDERR DS: DX = адрес начала строки СХ = длина строки

Вывод:

CF = 0, АХ = число записанных байт

Эта функция предназначена для записи в файл, но, если в регистр ВХ поместить число 1, функция 40h будет выводить данные на STDOUT, а если ВХ = 2 - на устройство STDERR. STDERR всегда выводит данные на экран и не перенаправляется в файлы. На этой функции основаны используемые в С функции стандартного вывода - фактически функция С fputs () просто вызывает это прерывание, помещая свой первый аргумент в ВХ, адрес строки (второй аргумент) - в DS: DX и длину - в СХ.

Простой пример работы функции DOS 40h.

Пример № 1.2

. model tiny

; модель памяти в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov ah,40h

; номер функции DOS

mov bx,2

; указываем устройство STDERR

mov dx,offset message

; DS: DX - адрес строки

mov cx,25

; CX - длина строки

int 21h

; вызов DOS

ret

; функция DOS "завершить программу"

message db "This function can print $"

; cтрока с содержащая выводимые данные.

end begin

; метка окончания кода программы

Если скомпилировать этот пример и запустить ее командой

dosout.com > dosout. out

то сообщение появится на экране, а файл dosout2. out окажется пустым.

Прерывание INT 29H

INT 29h: Быстрый вывод символа на экран

Ввод:

AL = ASCII-код символа

Простой пример работы прерывания INT 29h.

Пример № 1.3

. model tiny

; модель памяти в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov ax, < ASCII-код символа >

; заносим в регистр ax - любой ASCII-код символа

int 29h

; вызов прерывания DOS - вызов символа;

ret

; функция DOS "завершить программу"

end begin

; метка окончания кода программы

В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS "вывод символа на экран в режиме телетайпа", так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.

2. Средства BIOS

Функции DOS вывода на экран позволяют перенаправить вывод в файл, но не позволяют вывести текст в любую позицию экрана и не позволяют изменить цвет текста. DOS предполагает, что для более тонкой работы с экраном программы должны использоваться видеофункции BIOS. BIOS - обеспечивает доступ к некоторым устройствам, в частности к видеоадаптеру. Все функции видеосервиса BIOS вызываются через прерывание 10h.

2.1 Выбор видеорежима

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

2.1.1 Стандартные видеорежимы

INT 10h, АН = 00 - Установить видеорежим

Ввод:

AL = номер режима в младших 7 битах

Вывод:

Обычно никакого, но некоторые BIOS (Phoenix и AMI) помещают в AL 30Н для текстовых режимов и 20h для графических

Пример работы.

Пример № 2.1

. model tiny

; модель памяти в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov ah,00

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

mov al,5

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

int 10h

; вызов прерывания DOS - вызов видеосервиса;

ret

; функция DOS "завершить программу"

end begin

; метка окончания кода программы

Вызов этой функции приводит к тому, что экран переводится в выбранный режим. Если старший бит AL не установлен в 1, экран очищается. Номера текстовых режимов - 0, 1, 2, 3 и 7.0 и 1 - 16-цветные режимы 40x25 (с 25 строками по 40 символов в строке), 2 и 3 - 16-цветные режимы 80x25, 7 - монохромный режим 80x25. Существует еще много текстовых режимов с более высоким разрешением (80x43, 80x60, 132x50 и т.д.), но их номера для вызова через эту функцию различны для разных видеоадаптеров (например, режим 61h - 132x50 для Cirrus 5320 и 132x29 для Genoa 6400). Однако, если видеоадаптер поддерживает стандарт VESA BIOS Extention, в режимы с высоким разрешением можно переключаться, используя функцию 4Fh.

2.1.2 SuperVGA-видеорежим

INT 10h, АН = 4Fh, AL = 02 - Установить SuperVGA-видеорежим

Ввод:

ВХ = номер режима в младших 13 битах

Вывод:

AL = 4Fh, если эта функция поддерживается АН = 0, если переключение произошло успешно АН = 1, если произошла ошибка

Если бит 15 регистра ВХ установлен в 1, видеопамять не очищается. Текстовые режимы, которые можно вызвать с использованием этой функции: 80x60 (режим 108h), 132x25 (109h), 132x43 (10Ah), 132x50 (10Bh), 132x60 (10Ch).

Видеорежим, используемый в DOS по умолчанию, - текстовый режим 3.

2.2 Управление положением курсора

2.2.1 Устанавливаем положение курсора

INT 10h, АН = 02 - Установить положение курсора

Ввод:

АН = 02 ВН = номер страницы DH = строка DL = столбец

Пример работы.

Пример № 2.2.1

. model tiny

; модель памяти, в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov ah,02

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

mov bh,0

; устанавливаем номер страницы

mov dh,12

; строка 12

mov dl,29

; столбец 29

int 10h

; прерывания DOS - установить положение курсора в точку 12,29

mov ax, < ASCII-код символа >

; заносим в регистр ax - любой ASCII-код символа

int 29h

; вызов прерывания DOS - вызов символа;

ret

; функция DOS "завершить программу"

end begin

; метка окончания кода программы

С помощью этой функции можно установить курсор в любую позицию экрана, и дальнейший вывод текста будет происходить из этой позиции. Отсчет номера строки и столбца ведется от верхнего левого угла экрана (символ в левой верхней позиции имеет координаты 0,0). Номера страниц 0 - 3 (для режимов 2 и 3) и 0 - 7 (для режимов 1 и 2) соответствуют области памяти, содержимое которой в данный момент отображается на экране. Можно вывести текст в неактивную в настоящий момент страницу, а затем переключиться на нее, чтобы изображение изменилось мгновенно.

2.2.2 Считываем положение и размер курсора

INТ 10h, АН = 03 - Считать положение и размер курсора

Ввод:

АН = 03 ВН = номер страницы

Вывод:

DH, DL = строка и столбец текущей позиции курсора СН, CL = первая и последняя строки курсора

Возвращает текущее состояние курсора на выбранной странице (каждая страница использует собственный независимый курсор).

2.3 Вывод символов на экран

Каждый символ на экране описывается двумя байтами - ASCII-кодом символа и байтом атрибута, указывающим цвет символа и фона, а также является ли символ мигающим.

Атрибут символа:

Бит 7: символ мигает (по умолчанию) или фон яркого цвета (если его действие было переопределено видеофункцией 10h).

Биты 6 - 4: цвет фона. Бит 3: символ яркого цвета (по умолчанию) или фон мигает (если его действие было переопределено видеофункцией 11h).

Биты 2 - 0: цвет символа.

Цвета кодируются в битах, как показано в таблице №2.3 .

Таблица №2.3 Атрибуты символов

Обычный цвет

Яркий цвет

000b

черный

темно-серый

001b

синий

светло-синий

010b

зеленый

светло-зеленый

011b

голубой

светло-голубой

100b

красный

светло-красный

101b

пурпурный

светло-пурпурный

110b

коричневый

желтый

111b

светло-серый

белый

2.3.1 Считываем символ и атрибут символа в текущей позиции курсора.

INT 10h, АН = 08 - Считать символ и атрибут символа в текущей позиции курсора

Ввод:

АН = 08 ВН = номер страницы

Вывод:

АН = атрибут символа AL = ASCII-код символа

2.3.1 Выводим символ с заданным атрибутом на экран

INT 10h, АН = 09 - Вывести символ с заданным атрибутом на экран

Ввод:

АН = 09 ВН = номер страницы AL = ASCII-код символа BL = атрибут символа СХ = число повторений символа

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

Пример работы.

Пример № 2.2.1

. model tiny

; модель памяти, в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov ah,09

; помещаем номер функции DOS "вывод строки (9)" в регистр АН.

mov bh,0

; устанавливаем номер страницы

mov al, < ASCII-код символа >

; строка 12; заносим в регистр al - любой ASCII-код символа

mov bl, 00011111b

; атрибут символа (белый на голубом)

mov cx,555

; устанавливаем в счетчик кол-во выводимых символов

int 10h

; вызов прерывания DOS - вызов символа;

ret

; функция DOS "завершить программу"

end begin

; метка окончания кода программы

2.3.2 Выводим символ с текущим атрибутом на экран

INT 10h, АН = 0Ah - Вывести

Ввод:

АН = 0Ah ВН = номер страницы AL = ASCII-код символа СХ = число повторений символа

Эта функция также выводит любой символ на экран, но в качестве атрибута символа используется атрибут, который имел символ, находившийся ранее в этой позиции.

2.3.3 Выводим символ в режиме телетайпа

INT 10h, АН = 0Eh - Вывести символ в режиме телетайпа

Ввод:

АН = 0Eh ВН = номер страницы AL = ASCII-код символа

Символы CR (0Dh), LF (0Ah), BEL (7) интерпретируются как управляющие символы. Если текст при записи выходит за пределы нижней строки, экран прокручивается вверх. В качестве атрибута используется атрибут символа, находившегося в этой позиции.

2.3.4 Выводим строку символов с заданными атрибутами

INT 10h, AH = 13h - Вывести строку символов с заданными атрибутами

Ввод:

АН = 13h AL = режим вывода:

Бит 0 - переместить курсор в конец строки после вывода бит 1 - строка содержит не только символы, но также и атрибуты, так что каждый символ описывается двумя байтами: ASCII-код и атрибут биты 2 - 7 зарезервированы

СХ = длина строки (только число символов) BL = атрибут, если строка содержит только символы DH,DL = строка и столбец, начиная с которых будет выводиться строки ES: BP = адрес начала строки в памяти

Функция 13h выводит на экран строку символов, интерпретируя управляющие символы CR (0Dh), LF (0Ah), BS (08) и BEL (07). Если строка подготовлена в формате символ, атрибут - гораздо быстрее просто скопировать ее в видеопамять.

Функции BIOS удобны для переключения и настройки видеорежимов, но часто оказывается, что вывод текста на экран гораздо быстрее и проще выполнять просто копированием изображения в видеопамять.

3. Прямая работа с видеопамятью

Все, что изображено на мониторе - и графика, и текст, одновременно присутствует в памяти, встроенной в видеоадаптер. Для того чтобы изображение появилось на мониторе, оно должно быть записано в память видеоадаптера. Для этого отводится специальная область памяти, начинающаяся с абсолютного адреса 0B800h: 0000h (для текстовых режимов) и заканчивающаяся на 0B800h: FFFFh. Все, что программы пишут в эту область памяти, немедленно пересылается в память видеоадаптера. В текстовых режимах для хранения каждого изображенного символа используются два байта: байт с ASCII-кодом символа и байт с его атрибутом, так что по адресу 0B800h: 0000h лежит байт с кодом символа, находящимся в верхнем левом углу экрана; по адресу 0B800h: 0001h лежит атрибут этого символа; по адресу 0B800h: 0002h лежит код второго символа в верхней строке экрана и т.д.

Таким образом, любая программа может вывести текст на экран, простой командой пересылки данных, не прибегая ни к каким специальным функциям DOS или BIOS.

Пример работ с видеопамятью.

Пример № 3.1

. model tiny

; модель памяти, в которой сегменты кода, данных и стека объединены.

. code

; сегмент кода, который содержит данные.

org 100h

; начало СОМ-файла

begin:

; метка начала кода программы

mov ax,0003h

; видеорежим 3 (очистка экрана)

int 10h

; прерывание DOS - очистка экрана;

mov ax,0B800h

; загружаем в сегментный регистр ES число 0B800h

mov es,ax

mov di,0

; загружаем в регистр DI нуль

mov ah,31

; заносим в регистр ah - атрибут символа

mov al, < ASCII-код символа >

заносим в регистр al - любой ASCII-код символа

mov es: [di],ax

; заносим по адресу 0B800: 0000h атрибут и ASCII-код символа

mov ah,10h

; вызываем функцию 10h - чтобы можно было остановить программу до нажатия любой клавиши

int 16h

; вызываем прерывание 16h - сервис работы с клавиатурой BIOS

ret

; функция DOS "завершить программу"

end begin

; метка окончания кода программы

При подготовке данных для копирования в видеопамять в этой программе в строках (7) и (8) загружаем в сегментный регистр ES число 0B800h, которое соответствует сегменту дисплея в текстовом режиме. В строке (9) загружаем в регистр DI нуль. Это будет смещение относительно сегмента 0B800h. В строках (10) и (11) в регистр AH заносится атрибут символа (31 - ярко-белый символ на синем фоне) и в AL - ASCII-код символа (01 - рожица) соответственно.

В строке (12) заносим по адресу 0B800: 0000h (т.е. первый символ в первой строке дисплея - верхний левый угол) атрибут и ASCII-код символа (31 и 01 соответственно).

4. Задание для выполнения.

4.1 С помощью редактора эмулятора EMU 8086 напишите программы примеры, которых приведены в данной лабораторной работе.

4.2 Создайте файлы типа MZ и *.com.

4.3 Изучите структуру откомпилированных программ.

4.4 Получите задание у преподавателя (один из пяти вариантов табл. №1) напишите программу вывода на экран строки `Hello'.

4.5 Напишите программу работы переключения SuperVGA-видеорежимов (согласно вариантов табл. №2)

4.6 Подготовьте отчет, который должен содержать тексты программ, а также укажите описание работы команд программ.

4.7 В отчете должны содержаться ответы на следующие вопросы.

5. Контрольные вопросы

5.1 Перечислите функции вывода на экран средствами операционной системы DOS?

5.2 Принцип работы функции DOS 02h?

5.3 Укажите основные управляющие символы вывода на экран?


Подобные документы

  • Использование информационных технологий в образовании. Системы дистанционного обучения и виртуальные лаборатории. Мультимедийная платформа Adobe Flash. Этапы разработки виртуального лабораторного практикума: оптимизация кода и разработка компонентов.

    дипломная работа [3,3 M], добавлен 15.06.2017

  • Типы кластеров и анализ кластерных технологий. Принципы работы среды MPICH. Разработка рабочих заданий для лабораторных работ, программного обеспечения для лабораторного комплекса. Подготовка рабочих мест и описание хода выполнения лабораторных работ.

    дипломная работа [3,7 M], добавлен 13.02.2016

  • Характеристика основных моделей параллельных вычислений. Основные директивы и функции, применяемые в наиболее распространенных технологиях параллельного программирования. Функциональные требования к программе, реализующей лабораторный практикум.

    дипломная работа [3,1 M], добавлен 17.06.2013

  • Построение универсального лабораторного комплекса вычислительной техники. Создание программы-эмулятора контроля арифметическо-логического устройства с использованием остаточных кодов по модулю 3. Обоснование элементной базы; синтез основных узлов АЛУ.

    курсовая работа [1,9 M], добавлен 01.10.2013

  • Система дистанционного обучения Distance Learning Belarus и лабораторный практикум курса "Разработка трансляторов для языков программирования", его перенос в интерактивную среду обучения. Описание работы программы и её взаимодействия с пользователями.

    курсовая работа [588,5 K], добавлен 03.11.2012

  • Особенности дистанционного образования. Разработка электронного практикума по дисциплине "Методы и средства проектирования информационных систем и технологий". Предметная область, выделение информационных объектов. Разработка программного обеспечения.

    дипломная работа [2,1 M], добавлен 27.10.2017

  • Особенности дистанционного образования. Анализ функциональных характеристик среды дистанционного образования Moodle. Функционально-ориентированное проектирование электронного практикума. Разработка, тестирование и оценка надежности программного продукта.

    дипломная работа [2,0 M], добавлен 12.08.2017

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

    реферат [20,3 K], добавлен 20.05.2009

  • Виды телеком-услуг и анализ их качества. Предпосылки создания системы предоставления услуг связи "Виртуальный офис", основные требования к ней, функциональные особенности, внутренняя структура и принцип действия. Обоснование программного обеспечения.

    дипломная работа [1,2 M], добавлен 29.03.2015

  • Выбор инструментальных средств для разработки лабораторного практикума по работе с операционной системой Windows ХР. Рекомендации по установке виртуальной машины. Подключение жесткого диска, его разделение на разделы. Управление пользователями и группами.

    дипломная работа [4,7 M], добавлен 17.08.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.