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

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

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

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

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

5.4 Каким образом осуществить вывод программы в файл?

5.5 Укажите отличие функции DOS 02h от 06h?

5.6 Прерывание int 29h. Преимущества использования?

5.7 С помощью каких функций можно установить нужный видеорежим (текстовый, цветной, монохромный)?

5.8 Отметьте основные моменты установки super VGA-видеорежимов?

5.9 Укажите функции и прерывания управления положением курсора.

5.10 Перечислите функции считывания положения и размера курсора?

5.11 Вывод символов на экран средствами BIOS. Функции?

5.12 Прямая работа с видеопамятью. Принципы работы с видеопамятью?

5.13 Укажите преимущества вывода на экран с помощью непосредственной работы с видеопамятью?

5.14 Область памяти видеоадаптера?

5.15 Укажите код третьего символа в верхней строке экрана для работы с видеопамятью?

5.16 Если в примере № 1.2 длину строку указать большую, чем указанная что в данном случае будет выводиться на экрана

Табл. №1

вар.

Функция вывода (DOS)

Функция вывода (BIOS)

Видеопамять

02h

Ah=02h

`Hello'

06h

Ah=08h

09h

Ah=09h

40h

Ah=0Ah

29h

Ah=13h

Примечание: В примерах, в которых возможно задание различных параметров вывода (цвет символа, фона; номер строки, столбца, страницы и т.д.) выводите на экран слово "hello" с параметрами отличными от стандартных.

Табл. №2

вар.

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

108h

109h

10Ah

10Bh

10Ch

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

КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ

Цель работы: ознакомиться с работой команд логических операций: and, or, xor, test, not и реализацией их работы на практике.

Краткие теоретические сведения.

Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций в коде ASCII. Все эти команды обрабатывают один байт или одно слово в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.

Команда AND.

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

Правила побитового умножения:

Первый операнд-бит 0101

Бит результата 0001

Второй операнд-бит 0011

Пример 1

mov AX,0FFEh

and AX,5555h; AX=0554h

Пример 2

mov ax,00101001b

add ax,11110111b ; ax=00100001b

Команда OR

Команда OR (Логическое ВКЛЮЧАЮЩЕЕ ИЛИ) выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (источник) не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды команды OR могут быть байтами или словами. Команда воздействует на флаги OF, SF, ZF, PF и CF, при этом флаги CF и OF всегда сбрасываются в 0.

Правила побитового сложения:

Первый операнд-бит 0101

Бит результата 0111

Второй операнд-бит 0011

Пример 1

mov AX,000Fh

mov BX,00F0h

or AX,BX; AX=00FFh, BX=00F0h

Пример 2

mov AX,00101001b

mov BX,11110111b

or AX,BX ; mov dx,11111111b

Пример 3

mov AX,000Fh

or AX,8001h ; AX=800Fh

Команда XOR.

Команда ХОR (Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ) выполняет операцию логического (побитового) ИСКЛЮЧАЮЩЕГО ИЛИ над своими двумя операндами. Результат операции замещает первый операнд; второй операнд не изменяется. Каждый бит результата устанавливается в 1, если соответствующие биты операндов различны, и сбрасывается в 0, если соответствующие биты операндов совпадают.

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

Правила побитового исключающего или:

Первый операнд-бит 0101

Бит результата 0110

Второй операнд-бит 0011

Пример 1

mov AX,0Fh

хог AX,0FFFFh; AX=FFF0h

Пример 2

mov AX,00101001b

mov BX,11110111b

xor ax,bx; 11011110b

Пример 3

mov SI,0AAAAh

mov BX,5555h

xor SI,BX ; SI=FFFFh,BX=5555h

Пример 4

хог ВХ, ВХ ; Обнуление ВХ

Команда TEST.

Команда TEST (Логическое сравнение) выполняет операцию логического умножения И над двумя операндами и, в зависимости от результата, устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда TEST не изменяет ни один из операндов.

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

Правила побитового умножения:

Первый операнд-бит 0101

Бит результата 0001

Второй операнд-бит 0011

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

Флаг ZF устанавливается в 1, если в результате выполнения команды образовалось число, состоящее из одних двоичных нулей.

Флаг PF устанавливается в 1, если в результате выполнения команды образовалось число с четным количеством двоичных единиц в его битах.

Пример 1

test AX,1

jne label2: ; Переход, если бит 0 в АХ установлен

je label1: ; Переход, если бит 0 в АХ сброшен

Пример №1.4.1.1

. model tiny

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

. code

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

org 100h

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

begin:

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

mov СX,<число1 >

; загружаем в CX число1 <любое число1>

mov BX,<число2>

; загружаем в BX число2 <любое число2>

test cx,bx

; логически сравниваем числа в регистрах cx с bx

jne label2

; если одно из значений не равно 0 то переходим на метку label2

je label1

; если одно из значений равно 0 то переходим на метку label1

ret

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

label1:

; начало блока метки Label1

mov ah,9

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

mov dx,offset string

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

int 21h

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

ret

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

String db 'одно из чисел равно 0$'

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

label2:

; начало блока метки Label2

mov ah,9

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

mov dx,offset string1

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

int 21h

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

ret

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

string1 db 'не равны 0$'

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

end begin

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

Данный пример сравнивает два значения (строка (6)), если одно из двух значений равно нулю тогда переходим на метку label1 (строка (10)) далее выполняются команды, следующие после этой метки, в случае если одно из двух значений равно нулю тогда переходим на метку label2

Пример 2

test SI,8

jne bityes ; Переход, если бит 3 в SI установлен

je bitno ; Переход, если бит 0 в АХ сброшен

Пример 3

test DX,0FFFFh

jz null ; Переход, если DX=0

jnz smth; Переход, если DX не 0

Команда NOT.

Команда NOT (NOT Инверсия, дополнение до 1, логическое отрицание) выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда не воздействует на флаги процессора.

Правила побитовой инверсии:

Операнд-бит 0 1

Бит результата 1 0

Пример 1

mov AX,0FFFFh

not AX; AX=0000h

Пример 2

mov SI,5551h

not SI; SI=AAAEh

Характерные примеры работы команд логических операций.

Для следующих несвязанных примеров, предположим, что:

AL содержит 1100 0101

BH содержит 0101 1100:

1. AND AL,BH; Устанавливает в AL 0100 0100

2. OR BH,AL; Устанавливает в BH 1101 1101

3. XOR AL,AL; Устанавливает в AL 0000 0000

4. AND AL,00; Устанавливает в AL 0000 0000

5. AND AL,0FH; Устанавливает в AL 0000 0101

6. OR CL,CL; Устанавливает флаги SF и ZF

Примеры 3 и 4 демонстрируют способ очистки регистра.

В примере 5 обнуляются левые четыре бита регистра AL.

Можно применить команду OR для следующих целей:

1. OR CX,CX; Проверка CX на нуль

JZ; Переход, если нуль

2. OR CX,CX; Проверка знака в CX

JS; Переход, если отрицательно

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

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

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

Проанализируйте работу кода примера №1.4.1.1

С помощью справки эмулятора EMU8086 выясните работу команд (jne, je, js, jz)

Получите задание у преподавателя (один из четырех вариантов (команды (and, or, xor, test, not))) и, пользуясь правилами оформления ассемблерных программ, напишите три программы характеризующие (показывающие) работу их с числами (двоичной, десятеричной, шестнадцатеричной систем счисления) согласно перечислению приведенных примеров.

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

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

4.1 Назначение команд логических операций?

4.2 Команда and основное назначение?

4.3 Команда or основное назначение?

4.4 Команда xor основное назначение?

4.5 Команда test основное назначение?

4.6 Команда not основное назначение?

4.7 Альтернативная работа команд (test, xor, and)?

4.8 Допустим что будит

4.9 В чем заключается работа связки команд jne, je?

4.10 В чем заключается работа связки команд js, jz?

4.11 Что произойдет, если в примере №1.4.1.1 мы изменим строку (8) на следующую (jne label1)?

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

ОЗНАКОМЛЕНИЕ С РАБОТОЙ ЦИКЛОВ

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

Краткие теоретические сведения.

Циклы, позволяющие выполнить некоторый участок программы многократно, в любом языке являются одной из наиболее употребительных конструкций. В системе команд МП 86 циклы реализуются, главным образом, с помощью команды loop (петля), хотя имеются и другие способы организации циклов. В большинстве случаях число шагов в цикле определяется содержимым регистра СХ, поэтому максимальное число шагов составляет 64 К.

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

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

Организация цикла с помощью команды LOOP (Первый способ).

Команда loop (анг. петля) выполняет декремент содержимого регистра СХ (счетчик), и если оно не равно 0, осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне - 128... + 127 байт. Обычно метка помещается перед первым предложением тела цикла, а команда loop является последней командой цикла. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536 (если перед входом в цикл СХ=0). Команда не воздействует на флаги процессора.

Команда

Назначение

Процессор

LOOP метка

Организация циклов

8086

Простейший пример организации циклического перехода (со счетчиком в регистре cx) на языке Assembler:

. model tiny

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

. code

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

org 100h

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

begin:

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

mov cx,10

; загружаем в (регистр-счетчик) CX количество повторов (отсчет будет идти от 10 до 0)

Label1:

; создаем метку (Label - метка).

mov ah,9

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

mov dx,offset String

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

int 21h

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

loop Label1

; оператор loop уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1 (строка 6)

ret

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

string db 'privet $'

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

end begin

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

В строке (5) загружаем в CX количество повторов (отсчет будет идти от 10 до 0). В строке (6) создаем метку (Label - метка). Далее (строки (7) - (9)) выводим сообщение. И в строке (10) оператор loop уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1 (строка (6)). Таким образом, строка будет выведена на экран десять раз. Когда программа перейдет на строку (11), регистр CX будет равен нулю.

Организация цикла с помощью команды JMP (Второй способ).

Команда jmp передает управление в указанную точку того же или другого программного сегмента. Адрес возврата не сохраняется. Команда не воздействует на флаги процессора.

Команда jmp имеет пять разновидностей:

переход прямой короткий (в пределах - 128... + 127 байтов);

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

переход прямой дальний (в другой программный сегмент);

переход косвенный ближний;

переход косвенный дальний.

Все разновидности переходов имеют одну и ту же мнемонику jmp, хотя и различающиеся коды операций. Во многих случаях транслятор может определить вид перехода по контексту, в тех же случаях, когда это невозможно, следует использовать атрибутные операторы (short - прямой короткий переход; near ptr - прямой ближний переход; far ptr - прямой дальний переход; word ptr - косвенный ближний переход; dword ptr - косвенный дальний переход).

Команда

Назначение

Процессор

JMP метка

Безусловный переход

8086

. model tiny

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

. code

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

org 100h

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

begin:

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

label1:

; создаем метку

mov ah,9

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

mov dx,offset String

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

int 21h

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

jmp Label1

; переход на строку с меткой Label1

add cx,12

; прибавить к значению регистра cx число 12

(данная команда не выполняется)

dec cx

; уменьшить значение регистра cx на 1

(данная команда не выполняется)

ret

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

string db "PRIVET",13,10,'$'

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

end begin

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

В результате работы программы будет зациклен блок строк (6) - (10) (Вывод строки PRIVET многочисленное количество раз) Строки (10) - (11).

Организация цикла с помощью команд DEC и JNZ (Третий способ).

С помощь этих операторов можно создавать циклы, которые будут работать быстрее оператора Loop. Комбинированная работа команд DEC и JNZ уменьшает содержимое регистра CX на 1 и выполняет переход на метку, если в CX не равен нулю.

Команда DEC, кроме того, устанавливает флаг нуля во флаговом регистре в состояние 0 или 1. Команда JNZ затем проверяет эту установку.

Аналогично командам JMP и LOOP операнд в команде JNZ содержит значение расстояния между концом команды JNZ и адресом перехода (Label1), которое прибавляется к командному указателю. Это расстояние должно быть в пределах от - 128 до +127 байт.

Следующий пример будет работать так же, как и Пример №1.1, только быстрее.

. model tiny

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

. code

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

org 100h

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

begin:

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

mov cx,10

; загружаем в (регистр-счетчик) CX количество повторов (отсчет будет идти от 10 до 0)

Label1:

; создаем метку (Label - метка).

mov ah,9

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

mov dx,offset String

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

int 21h

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

dec cx

; оператор DEC уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1

jnz Label1

; условный переход на строку с меткой Label1

ret

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

string db 'priver ',13,10, '$'

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

end begin

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

2. Программа для практики.

Напишем программу, выводящую на экран все ASCII-символы (16 строк по 16 символов в строке).

. model tiny

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

. code

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

org 100h

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

begin:

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

mov cx,256

; задаем значение счетчика (256 символов)

mov dl,0

; первый символ - с кодом 00

mov ah,2

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

cloop: int 21h

; вызов DOS

inc dl

; увеличение DL на 1 - следующий символ

test dl,0Fh

; если DL не кратен 16

jnz continue_loop;

; продолжить цикл,

push dx

; иначе: сохранить текущий символ

mov dl,0Dh

; вывести CR

int 21h

; вызов DOS

mov dl,0Ah

; вывести LF

int 21h

; вызов DOS

pop dx

; восстановить текущий символ

continue_loop:

; метка

loop cloop

; продолжить цикл

ret

; завершение СОМ-файла

end begin

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

Здесь с помощью команды LOOP оформляется цикл, выполняющийся 256 раз (значение регистра СХ в начале цикла). Регистр DL содержит код символа, который равен нулю в начале цикла и увеличивается каждый раз на 1 командой INC DL. Если значение DL сразу после увеличения на 1 кратно 16, оно временно сохраняется в стеке и на экран выводятся символы CR и LF, выполняющие переход на начало новой строки. Проверка выполняется командой TEST DL,0Fh - результат операции AND над DL и 0Fh будет нулем, только если младшие четыре бита DL равны нулю, что и соответствует кратности шестнадцати.

3. Содержание отчета.

3.1 Титульный лист.

3.2 Индивидуальный вариант задания.

3.3 Тестовые наборы данных и предполагаемые результаты.

3.4 Текст программы до отладки.

3.5 Список ошибок, обнаруженных при отладке.

3.6. Результаты выполнения тестов.

3.7. Распечатка листинга компиляции отлаженной программы с указанием работы каждой строки.

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

4.1 Выполните все примеры, что содержатся в описании данной лабораторной работы.

4.2 Проанализируйте работу программы примера для практики.

4.3 Изучить условия организации циклических переходов на языке Ассемблера.

4.4 Напишите программу, выводящую на экран слово "!!!!!!!!!! Hello!!!!!!!!!!" используя команды циклических переходов (3 варианта).

4.5 Получите задание у преподавателя (один из пяти вариантов табл. №1) и, пользуясь правилами оформления ассемблерных программ, создайте программу, выводящую на экран слово, D число раз.

4.6 Программу ассемблируйте в файл типа *.com или *. exe (на выбор);

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

5.1 Организация цикла с помощью команды loop?

5.2 Значимость регистра cx?

5.3 Максимальное число повторений команд цикла определяемого регистром сх?

5.4 Организация цикла с помощью команды jmp?

5.5. Разновидности команды jmp?

5.6. Организация цикла с помощью команд dec и jnz?

Табл. №1

вар.

Выводимые данные

Формула расчета

А

B

С

Циклический переход

D=A+B+C

101

345

121

Hello world

D=A-B+C

578

152

149

Good Bye

D=A+B-C

333

223

16

Группа

D=A-B+C

1502

834

1

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

D=A-B-C

1056

33

125

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

СПОСОБЫ И МЕТОДЫ ВЫВОДА ЧИСЕЛ

Цель работы: Освоить методы вывода чисел в двоичном, шестнадцатеричном и десятичном коде.

1. Вывод двоичного кода числа, записанного в регистр DH.

Методика выполнения.

Нужно последовательно проанализировать биты числа. В данной работе ограничимся байтом, который будем хранить в DH. Если бит нулевой (сброшен), то нужно вывести '0', если установлен, то '1'.

Алгоритм решения задачи:

проанализировать значение одного бита;

вывести значение бита;

перейти к следующему биту. И так 8 раз (БАЙТ!) - ЦИКЛ

Анализ бита: При анализе значения программисты обычно используют команду TEST, но в данной лабораторной работе мы будет использовать следующую команду SHL

Команда SHL осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате

SHL операнд, 1

сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате

SHL операнд,CL

сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями

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

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

Команда воздействует на флаги OF, SF, ZF, PF и CF.

Прореагировать на значение флага можно с помощью команды

JNC <метка>

Осуществляется переход на метку, если флаг CF равен нулю, иначе выполняется команда, непосредственно идущая после команды.

Пример №1.1

. model tiny

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

. code

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

org 100h

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

begin:

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

mov DH,<55>

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

mov AH,2

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

mov CX,8

; инициализация переменной цикла

@1: mov DL,'0'

; заносим в DL код символа '0'

shl DH, 1

; сдвиг на 1 бит

jnc @2

; переход, если '0'

inc DL

; используем тот факт, что код символа '1' на единицу больше кода символа '0'

@2: int 21h

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

LOOP @1

; переходим на метку @1

int 21h

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

end begin

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

Замечание: в описанном способе анализа значение исходного числа теряется. Иначе следует использовать команду ROL, но 8 раз для байта.

2. Вывод значения байта в шестнадцатеричной системе счисления

2.1 Методика выполнения.

Алгоритм решения задачи:

Допустим, что байт, значение которого нужно вывести, находится в регистре DH, и имеется таблица символов "0123456789ABCDEF". Байт состоит из двух шестнадцатеричных цифр. С учетом этого задачу можно решить так: нужно вывести на экран два символа из этой таблицы. Сначала - символ с номером, равным старшему полубайту числа, а потом с номером, равным младшему полубайту.

Для решения задачи нужно решить две небольшие проблемы:

Записать в AL символ с нужным номером. Воспользуемся регистровым косвенным режимом адресации со смещением. Для этого значение каждого полубайта следует записывать в BX;

Записать в BX значение полубайта.

Простейший способ решения задачи.

Пример №2.1

. model tiny

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

. code

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

org 100h

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

begin:

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

mov dh, 10

; заносим в регистр dh число 10

mov bl, dh

; заносим в регистр bl число 10

xor bh, bh

; Обнуление вх

and bl, 0F0h

; осуществляем логическое (побитовое) умножение dh на 0f0h.

shr bl, 4

; сдвиг в право на 4 бита

mov al, table [bx]

; заносим в регистр al значение строки данных

int 29h

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

mov bl, dh

; заносим в регистр bl значение регистра dh

and bl, 0Fh

; осуществляем логическое (побитовое) умножение dh на 0fh.

mov al, table [bx]

; заносим в регистр al значение строки данных

int 29h

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

mov al, 13

; заносим в регистр al число 13

int 29h

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

mov al, 10

; заносим в регистр al число 10

int 29h

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

ret

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

table db '0123456789ABCDEF'

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

end begin

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

3. Вывод значения байта в десятеричной системе счисления

3.1 Методика выполнения

Алгоритм решения задачи:

Будем считать, что байт, значение которого нужно вывести, находится в регистре DH. Однако теперь применим другой способ вывода символа цифры на экран: используем тот факт, что коды символов, обозначающих цифры, отличаются от них на 30h. Но проблема здесь другая: заранее не известно, сколько цифр нужно отобразить, одну или три. Байт может принимать значение от 0 до 255. И есть еще одна проблема. При записи числа с применением позиционной системы записи в некоторой системе счисления поступают следующим образом: вычисляют и записывают остатки от деления числа на основание системы. Так поступают до тех пор, пока частное от деления не станет равным нулю. Затем остатки выписывают в порядке, обратном тому, как они получены.

Пример:

число = 251.

Делим на 10. Частное 25, остаток "1".

Делим на 10. Частное 2, остаток "5".

Делим на 10. Частное 0, остаток "2".

Нужно вывести на экран "2", "5", "1".

Задача решается с использованием стека программы. Остатки будем помещать в стек программы с помощью оператора PUSH. Одновременно будем подсчитывать число остатков, помещенных в стек. Счетчик - CX. Потом его используем для организации цикла, в котором будем извлекать остатки из стека оператором POP. Стек организован таким образом, что оператор POP извлекает последнее слово, которое было помещено туда оператором PUSH. Отметим, что оператор PUSH помещает в стек слово (WORD) или двойное слово (DWORD). Аналогично работает и оператор POP

3.1.1 Команда PUSH (занесение операнда в стек).

Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать в стек можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.

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

Пара команд push - pop часто используется для пересылки данного из регистра в регистр (особенно, в сегментный) через стек.

Пример 1

push ES: mem; Сохранение содержимого

push DS; слова памяти mem из

push BP; дополнительного сегмента, а также регистров DS и ВР

pop PP; Восстановление из стека

pop DS; трех операндов

pop ES: mem; в обратном порядке

Пример 2

push DS; Пересылка DS через стек

pop ES; Теперь ES=DS

Простейший способ решения задачи вывода значения байта в десятеричной системе счисления

Пример № 3.1

. model tiny

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

. code

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

org 100h

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

begin:

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

mov dh, 33

; заносим в регистр dh число 33

mov al, dh

; заносим в регистр al число 33

xor ah, ah

; обнуление ah

mov bl, 10

; заносим в регистр bl число 10

xor cx, cx

; обнуление сх (счетчик)

@1:

; устанавливаем метку @1

div bl

; делим целое число (регистр ax) без знака, на число (регистр bl)

push ax

; пересылаем ax через стек

inc cx

; увеличиваем на 1 cx (счетчик)

xor ah, ah

; обнуление ah

or ax, ax

; логического (побитового) сложения само на себя

jnz @1

; если флаг zf не ноль, то переходим на метку @1

@2:

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

pop ax

; заносим в регистр al число 10

xchg ah, al

; обмен данными между операндами ah и al

add al, 30h

; прибавляем к al число 30h

int 29h

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

loop @2

; реализация цикла - переходим на метку @2

mov al, 13

; заносим в регистр al число 13

int 29h

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

mov al, 10

; заносим в регистр al число 10

int 29h

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

ret

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

end begin

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

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

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

3.2 Создайте исполняемые файлы типа *.com.

3.3 Изучите работу полученных программ.

3.4 Напишите программу для вывода на экран содержимого регистра DS (на основе примера №2.1). Сравните результат работы своей программы и того, что показывает отладчик.

3.5 Опишите работу команд DIV, PUSH, POP, SHL, TEST.

3.6 Установите (найдите адреса и запишите), где находятся числа, помещенные в стек.

3.7 Напишите программу для вывода на экран содержимого регистра СS (на основе примера №3.1).

3.8 Предложите другие способы решения поставленных задач.

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

Преимущества использования команды SHL вместо TEST (пример №1.1)?

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

SHL dx,1

и

SHL dx, cl

Как переслать содержимое X в стек и получить обратно?

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

Опишите методику вывода значения байта в шестнадцатеричной системе счисления?

Опишите методику вывода двоичного кода числа, записанного в регистр X

Стек. Принцип работы. Команды работы со стеком.

Укажите отличия в работе тандема команд

push DS

pop ES

от

push DS

pop ES

Лабораторная работа № 5, 6

КОМАНДЫ, ОБСЛУЖИВАЮЩИЕ РАБОТУ С КЛАВИАТУРОЙ

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

1. Средства BIOS

Так же как и для вывода на экран, BIOS предоставляет больше возможностей по сравнению с DOS для считывания данных и управления клавиатурой. Например, функциями DOS нельзя определить нажатие комбинаций клавиш типа Ctrl-Alt-Enter или нажатие двух клавиш Shift одновременно, DOS не может определить момент отпускания нажатой клавиши, и наконец, в DOS нет аналога функции С ungetch (), помещающей символ в буфер клавиатуры, как если бы его ввел пользователь. Все это можно осуществить, используя различные функции прерывания 16h и операции с байтами состояния клавиатуры.

INT 16h, АН = 0, 10h, 20h - Чтение символа с ожиданием

Ввод:

АН = 00h (83/84-key), 10h (101/102-key), 20h (122-key)

Вывод:

AL = ASCII-код символа, 0 или префикс скан-кода

АН = скан-код нажатой клавиши или расширенный ASCII-код

Каждой клавише на клавиатуре соответствует так называемый скан-код (см. приложение 1), соответствующий только этой клавише. Этот код посылается клавиатурой при каждом нажатии и отпускании клавиши и обрабатывается BIOS (обработчиком прерывания INT 9). Прерывание 16h дает возможность получить код нажатия, не перехватывая, этот обработчик. Если нажатой клавише соответствует ASCII-символ, то в АН возвращается код этого символа, а в AL - скан-код клавиши. Если нажатой клавише соответствует расширенный ASCII-код, в AL возвращается префикс скан-кода (например, Е0 для серых клавиш) или 0, если префикса нет, а в АН - расширенный ASCII-код. Функция 00Н обрабатывает только комбинации, использующие клавиши 84-клавишной клавиатуры, l0h обрабатывает все 101 - 105-клавишные комбинации, 20h - 122-клавишные. Тип клавиатуры можно определить с помощью функции 09h прерывания 16h, если она поддерживается BIOS (поддерживается ли эта функция, можно узнать с помощью функции C0h прерывания 15h).

INT 16h, АН = 1, 11h, 21h - Проверка символа

Ввод:

АН = 01h (83/84-key), 11h (101/102-key), 21h (122-key)

Вывод:

ZF = 1, если буфер пуст

ZF = 0, если в буфере присутствует символ, в этом случае

AL = ASCII-код символа, 0 или префикс скан-кода

АН = скан-код нажатой клавиши или расширенный ASCII-код

Символ остается в буфере клавиатуры, хотя некоторые BIOS удаляют символ из буфера при обработке функции 01h, если он соответствует расширенному ASCII-коду, отсутствующему на 84-клавишных клавиатурах.

INT 16h, АН = 05h - Поместить символ в буфер клавиатуры

Ввод:

АН = 05h

СН = скан-код

CL = ASCII-код

Вывод:

AL = 00, если операция выполнена успешно

AL = 01h, если буфер клавиатуры переполнен

АН модифицируется многими BIOS

Обычно можно поместить 0 вместо скан-кода в СН, если функция, которая будет выполнять чтение из буфера, будет использовать именно ASCII-код.

Например, следующая программа при запуске из DOS вызывает команду DIR (но при запуске из некоторых оболочек, например FAR, этого не произойдет).

Пример №1.1

. model tiny

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

. code

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

org 100h

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

begin:

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

mov cl,'d'

; заносим в регистр cl - ASCII-код буквы "d"

call ungetch

; переходим на метку ungetch: (вызов подпрограммы)

mov cl,'i'

; заносим в регистр cl - ASCII-код буквы "i"

call ungetch

; вызываем подпрограмму

mov cl,'r'

; заносим в регистр cl - ASCII-код буквы "r"

call ungetch

; вызываем подпрограмму

mov cl,0Dh

; перевод строки

Ungetch proc

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

mov ah,05h

; AH = номер функции

mov ch,0

; CH = 0 (скан-код неважен)

int 16h

; вызов DOS (прерывание)

ret

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

Ungetch endp

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

end begin

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

Оформление процедур (подпрограмм).

______________

Call ungetch

Ungetch proc

Ungetch endp

______________

Ungetch - название процедуры

Call - вызов подпрограммы

Proc - procedure - процедура

endp - end procedure - конец процедуры

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

Call метка

метка:

Любой вызов подпрограмм заканчивается возращение в блок кода командой ret (ret - return - возврат).

INT 16h, AH = 02h, 12h, 22h - Считать состояние клавиатуры

Ввод:

АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)

Вывод:

AL = байт состояния клавиатуры 1

АН = байт состояния клавиатуры 2 (только для функций 12h и 22h)

Байт состояния клавиатуры 1 (этот байт всегда расположен в памяти по адресу 0000h: 0417h или 0040h: 0017h):

Бит 7: Ins включена

Бит 6: CapsLock включена

Бит 5: NumLock включена

Бит 4: ScrollLock включена

Бит 3: Alt нажата (любая Alt для функции 02h, часто только левая Alt для 12h/22h)

Бит 2: Ctrl нажата (любая Ctrl)

Бит 1: Левая Shift нажата

Бит 0: Правая Shift нажата

Байт состояния клавиатуры 2 (этот байт всегда расположен в памяти по адресу 0000h: 0418h или 0040h: 0018h):

Бит 7: SysRq нажата

Бит 6: CapsLock нажата

Бит 5: NumLock нажата

Бит 4: ScrollLock нажата

Бит 3: Правая Alt нажата

Бит 2: Правая Ctrl нажата

Бит 1: Левая Alt нажата

Бит 0: Левая Ctrl нажата

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

Помимо этих двух байт BIOS хранит в своей области данных и весь клавиатурный буфер, к которому также можно обращаться напрямую. Буфер занимает 16 слов с 0h: 041Eh no 0h: 043Dh включительно, причем по адресу 0h: 041Ah лежит адрес (ближний) начала буфера, то есть адрес, по которому располагается следующий введенный символ, а по адресу 0h: 041Ch лежит адрес конца буфера, так что если эти два адреса равны, буфер пуст. Буфер действует как кольцо: если начало буфера - 043Ch, а конец - 0420h, то в буфере находятся три символа по адресам 043Ch, 041Eh и 0420h. Каждый символ хранится в виде слова - того же самого, которое возвращает функция 10h прерывания INT 16h. В некоторых случаях (если) буфер размещается по другим адресам, тогда адрес его начала хранится в области данных BIOS по адресу 0480h, а конца - по адресу 0482h. Прямой доступ к буферу клавиатуры лишь немногим быстрее, чем вызов соответствующих функций BIOS, и для приложений, требующих максимальной скорости, таких как игры или демо-программы, используют управление клавиатурой на уровне портов ввода-вывода.

2. Средства DOS

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

Функция DOS 0Ah - Считать строку символов из STDIN в буфер

Ввод:

АН = 0Ah

DS: DX = адрес буфера

Вывод:

Буфер содержит введенную строку

Для вызова этой функции надо подготовить буфер, первый байт которого содержит максимальное число символов для ввода (1-254), а содержимое, если оно задано, может использоваться как подсказка для ввода. При наборе строки обрабатываются клавиши Esc, F3, F5, BS, Ctrl-C/Ctrl-Break и т.д., как при наборе команд DOS (то есть Esc начинает ввод сначала, F3 восстанавливает подсказку для ввода, F5 запоминает текущую строку как подсказку, Backspace стирает предыдущий символ). После нажатия клавиши Enter строка (включая последний символ CR (0Dh)) записывается в буфер, начиная с третьего байта. Во второй байт записывается длина реально введенной строки без учета последнего CR.

Рассмотрим пример программы, выполняющей преобразование десятичного числа в шестнадцатеричное.

Пример №2.1

. model tiny

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

. code

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

org 100h

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

start:

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

mov dx,offset messagel

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

mov ah,9

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

int 21h

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

mov dx,offset buffer

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

mov ah,0Ah

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

int 21h

; считать строку символов в буфер

mov dx,offset crlf

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

mov ah,9

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

int 21h

; перевод строки

xor di,di

; DI = 0 - номер байта в буфере

xor ax,ax

; АХ = 0 - текущее значение результата

mov cl,blength

xor ch,ch

; обнуляем регистр ch

xor bx,bx

; обнуляем регистр bx

mov si,cx

; SI - длина буфера

mov cl,10

; CL = 10, множитель для MUL

asc2hex:

; метка начала блока asc2hex:

mov bl,byte ptr bcontents [di]

sub bl,'0'

; цифра = код цифры - код символа "0",

jb asc_error

; если код символа был меньше, чем код "0",

cmp bl,9

; или больше, чем "9",

ja asc_error

; выйти из программы с сообщением об ошибке,

mul cx

; иначе: умножить текущий результат на 10,

add ax,bx

; добавить к нему новую цифру,

inc di

; увеличить счетчик

cmp di,si

; если счетчик+1 меньше числа символов -

jb asc2hex

; продолжить (счетчик считается от 0)

push ax

; сохранить результат преобразования

mov ah,9

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

mov dx,offset message2

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

int 21h

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

pop ax

; считать из стека

push ax

; записать в стек

xchg ah,al

; поместить в AL старший байт

call print_al

; вывести его на экран

pop ax

; восстановить в AL младший байт

call print_al

; вывести его на экран

ret

; завершение СОМ-файла

asc_error:

; начало блока asc_error:

mov dx,offset err_msg

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

mov ah,9

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

int 21h

; вывести сообщение об ошибке

ret

; завершить программу

print_al:

; метка начала блока print_al:

mov dh,al

; заносим в dh значение регистра al

and dh,0Fh

; DH - младшие 4 бита

shr al,4

; AL - старшие

call print_nibble

; вывести старшую цифру

mov al,dh

; теперь AL содержит младшие 4 бита

print_nibble:

; процедура вывода 4 бит (шестнадцатеричной цифры)

cmp al,10

; три команды, переводящие цифру в AL

sbb al,69h

; в соответствующий ASCII-код

das

; (см. описание команды DAS)

mov dl,al

; код символа в DL

mov ah,2

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

int 21h

; вывод символа

ret

; этот RET работает два раза - один раз для возврата из процедуры print_nibble, вызванной для старшей цифры и второй раз - для возврата из print_al

messagel db "Десятичное число: $"

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

message2 db "Шестнадцатеричное число: $"

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

err_msg db "Ошибка ввода"

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

crlf db 0Dh,0Ah, '$'

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

Buffer db 6

; максимальный размер буфера ввода

blength db?

; размер буфера после считывания

bcontents:

; содержимое буфера располагается за концом СОМ-файла

end start

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

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

Функция DOS 01h - Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl-Break

Ввод:

АН = 01h

Вывод:

AL = ASCII-код символа или 0. Если AL = 0, второй вызов этой функции возвратит в AL расширенный ASCII-код символа

При чтении с помощью этой функции введенный символ автоматически немедленно отображается на экране (посылается в устройство STDOUT - так что его можно перенаправить в файл). При нажатии Ctrl-C или Ctrl-Break выполняется команда INT 23h. Если нажата клавиша, не соответствующая какому-нибудь символу (стрелки, функциональные клавиши Ins, Del и т.д.), то в AL возвращается 0 и функцию надо вызвать еще один раз, чтобы получить расширенный ASCII-код (см. приложение 1).

В трех следующих вариантах этой функции код символа возвращается в AL по такому же принципу.

Функция DOS 08h - Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break

Ввод:

АН = 08h

Вывод:

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

Функция DOS 07h - Считать символ из STDIN без эха, с ожиданием и без проверки на Ctrl-Break

Ввод:

АН = 07h

Вывод:

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

Функция DOS 06h - Считать символ из STDIN без эха, без ожидания и без проверки на Ctrl-Break

Ввод:

АН = 07h

DL = 0FFh

Вывод:

ZF = 1, если не была нажата клавиша, и AL = 00

ZF = 0, если клавиша была нажата. В этом случае AL = код символа

2.2 служебные функции DOS для работы с клавиатурой.

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

Функция DOS 0Bh - Проверить состояние клавиатуры

Ввод:

АН = 0Bh

Вывод:

AL = 0, если не была нажата клавиша

AL = 0FFh, если была нажата клавиша

Эту функцию удобно использовать перед функциями 01, 07 и 08, чтобы не ждать нажатия клавиши. Кроме того, вызов этой функции позволяет проверить, не считывая символ с клавиатуры, была ли нажата комбинация клавиш Ctrl-Break; если это произошло, выполнится прерывание 23h.

Функция DOS 0Ch - Очистить буфер и считать символ

Ввод:

АН = 0Ch

AL = Номер функции DOS (01, 06, 07, 08, 0Ah)

Вывод:

Зависит от вызванной функции

Функция 0Ch очищает буфер клавиатуры, так что следующая функция чтения символа будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Например, именно эта функция используется для считывания ответа на вопрос "Уверен ли пользователь в том, что он хочет отформатировать диск?".

Функции посимвольного ввода без эха можно использовать для интерактивного управления программой.

. model tiny

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

. code

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

org 100h

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

Begin:

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

call Wait_key

; вызываем подпрограмму

cmp al,27

; сравниваем значение в al с кодом 27 (ESC)

; если да - то на метку Quit_prog

je Quit_prog

cmp al,0

; код клавиши расширенный? (F1-F12 и т.п.)

je Begin

; да - повторим запрос...

call Out_char

; вызываем процедуру вывода нажатой клавиши на экран

jmp Begin

; ждем дальше...

Quit_prog:

; метка, на которую придет программа в случае нажатия ESC

mov al,32

; помещаем в AL <пробел>

call Out_char

; вызываем процедуру вывода символа в AL

int 20h

; выходим...

Wait_key proc

; процедура ожидания клавиши от пользователя

mov ah,10h

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

int 16h

; прерывание DOS

ret

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

Wait_key endp

; окончание процедуры Wait_key

Out_char proc

; начало процедуры out_char

push cx

; сохраним все регистры, которые будут изменены подпрограммой...

push ax

;... сделаем это для того, чтобы в последствии не было путаницы

push es

; сохраним сегментный регистр

push ax

; сохраним AX, т.к в нем код нажатой клавиши...

mov ax,0B800h

; установим ES на сегмент видеобуфера

mov es,ax

mov di,0

; DI - первый символ первой строки

mov cx, 2000

; выводим 2000 символов (80 символов в строке 25 строк)

pop ax

; восстановим код клавиши

mov ah,31

; цвет символа

Next_sym:

; метка для цикла

mov es: [di],ax

; заносим код клавиши и ее цвет (цвет всегда 31)

inc di

; увеличиваем указатель на 2 (первый байт - символ, второй байт - цвет)

inc di

loop Next_sym

; обработка следующего символа

pop es

; восстановим сохраненные регистры и выровним стек

pop ax

pop cx

ret

; вернемся из процедуры

Out_char endp

; окончание процедуры Out_char

end Begin

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

Программа делает следующее:

Ждет от пользователя клавиши;

если это расширенный ASCII (F1-F12, стрелки), то игнорирует ее;

если это не расширенный ASCII (A-Z, 0-9 и т.п.) - заполнить экран данным символом;

если нажимаем ESC (27 или 1Bh), то заполнить экран пробелами (mov al,32) и выйти.

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

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

3.2 Создайте исполняемые файлы типа *.com.

3.3 Изучите работу полученных программ.

3.4 Напишите программу для вывода на экран содержимого регистра DS (на основе примера №2.1). Сравните результат работы своей программы и того, что показывает отладчик.

3.5 Опишите работу команд DIV, PUSH, POP, SHL, TEST.

3.6 Установите (найдите адреса и запишите), где находятся числа, помещенные в стек.

3.7 Напишите программу для вывода на экран содержимого регистра СS (на основе примера №3.1).

3.8 Предложите другие способы решения поставленных задач.

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

Преимущества использования команды SHL вместо TEST (пример №1.1)?

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

SHL dx,1

и

SHL dx, cl

Как переслать содержимое X в стек и получить обратно?

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

Опишите методику вывода значения байта в шестнадцатеричной системе счисления?

Опишите методику вывода двоичного кода числа, записанного в регистр X

Стек. Принцип работы. Команды работы со стеком.

Укажите отличия в работе тандема команд.

push DS

pop ES

от

push DS

pop ES

Приложение №1

Основные Скан-Коды клавиш клавиатуры.

Клавиша

Код

Клавиша

Код

Клавиша

Код

Клавиша

Код

Esc

01h

Enter

1Ch

K*

37h

Ins

52h

1!

02h

Ctrl

1Dh

Alt

38h

Del

53h

2 @

03h

A

1Eh

SP

39h

SysRq

54h

3 #

04h

S

1Fh

Caps

3Ah

Macro

56h

4 $

05h

D

20h

F1

3Bh

F11

57h

5%

06h

F

21h

F2

3Ch

F12

58h

6 ^

07h

G

22h

F3

3Dh

PA1

5Ah

7 &

08h

H

23h

F4

3Eh

F13/LWin

5Bh

8 *

09h

J

24h

F5

3Fh

F14/RWin

5Ch

9 (

0Ah

K

25h

F6

40h

F15/Menu

5Dh

0)

0Bh

L

26h

F7

41h

F16

63h

- _

0Ch

;:

27h

F8

42h

F17

64h

= +

0Dh

' "

28h

F9

43h

F18

65h

BS

0Eh

` ~

29h

F10

44h

F19

66h

Tab

0Fh

LShift

2Ah

Num

45h

F20

67h

Q

10h

\ |

2Bh

Scroll

46h

F21

68h

W

11h

Z

2Ch

Home

47h

F22

69h

E

12h

X

2Dh

-

48h

F23

6Ah

R

13h

C

3Eh

PgUp

49h

F24

6Bh

T

14h

V

2Fh

K-

4Ah

EraseEOF

6Dh

Y

15h

B

30h

4Bh

Copy/Play

6Fh

U

16h

N

31h

K5

4Ch

CrSel

72h

I

17h

M

32h

®

4Dh

Delta

73h

O

18h

, <

33h

K+

4Eh

ExSel

74h

P

19h

. >

34h

End

4Fh

Clear

76h

[{

1Ah

/?

35h

I

50h

] }

1Bh

RShift

36h

PgDn

51h

3. Создание лабораторного практикума "Операционная система"

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

"Собственно ядро"

Драйвера устройств

Системные вызовы

В зависимости от организации внутренних взаимодействий, ядра подразделяются на "микроядра" (microkernel) и монолитные ядра.

Системы с "микроядром" строятся по модульному принципу, имеют обособленное ядро, и механизм взаимодействия между драйверами устройств и процессами. По такому принципу строятся системы реального времени. Примерно так сделан QNX или HURD.

Монолитное ядро имеет более жесткую внутреннюю структуру. Все установленные драйвера жестко связываются между собой, обычно прямыми вызовами. По таким принципам строятся обыкновенные операционные системы типа Linux, FreeBSD.

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

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

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

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

Процессор предоставляет 4 "кольца защиты" (уровня привилегий), можно было бы использовать все, но это связано со сложностями взаимодействия программ разного уровня защиты. Поэтому в большинстве существующих систем используют два уровня.0 - привилегированный уровень (ядро) и 3 - непривилегированный (пользовательские программы).

Всем этим обеспечивается надежное функционирование системы и независимость программ друг от друга.

На "Собственно ядро" возлагаются функции менеджера памяти и процессов. Переключение процессов - это основной момент нормального функционирования системы. Драйвера не должны "тормозить", а тем более блокировать работу ядра. Windows - наглядный пример того, что этого нельзя допустить!


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

  • Использование информационных технологий в образовании. Системы дистанционного обучения и виртуальные лаборатории. Мультимедийная платформа 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-файлы представлены только в архивах.
Рекомендуем скачать работу.