Команды ввода-вывода на экран дисплея и их использование в программах обработки 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Команды ввода-вывода на экран дисплея и их использование в программах обработки



ЦЕЛЬ И ЗАДАЧА РАБОТЫ

 

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

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

 

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

 

Метод подъема

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

Метод подъема можно отнести к одному из общих “рецептов” разработки алгоритмов. Его суть заключается в следующей процедуре: алгоритм начинается с принятия начального предположения или построения начального решения задачи. Затем начинается (насколько возможно) быстрое движение “вверх” от начального уровня по направлению к лучшим решениям. Когда алгоритм достигает точки, из которой больше невозможно двигаться “наверх”, он останавливается.

Такой метод применяется, например, в задачах поиска экстремумов (максимумов и минимумов) среди некоторой совокупности числовых данных.

Начальное решение можно сформулировать так: пусть экстремальным значением является значение первого элемента из заданной совокупности данных.

Лучшим решением по отношению к начальному является такой элемент совокупности, у которого значение больше (в случае поиска максимума) или меньше (в случае поиска минимума) по отношению к начальному значению или к промежуточному “лучшему” решению.

Критерием окончания алгоритма (точкой, из которой больше невозможно двигаться “наверх”) является просмотр всех элементов из заданной совокупности.

 

Команды прерывания

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

Команды прерывания позволяют воспользоваться встроенными системными ресурсами (программами обработки прерываний) из программы пользователя. Под системными ресурсами понимаются программы, входящие в главную исполнительную программу ЭВМ, которая называется BIOS – базовая система ввода-вывода. В функции этой системы входит: запоминание символов, набираемых на клавиатуре, изображение символов на экране дисплея, обмен данными между устройствами, присоединенными к ЭВМ: дисководами, принтером и т.п. Чтобы обратиться к этим возможностям ЭВМ, пользовательская программа должна быть прервана и выполнена системная функция, после чего пользовательская программа должна быть продолжена со следующей после обращения к системным функциям команды. Эти функциональные возможности и выполняют команды прерывания, имеющие формат INT тип_прерывания.

В этой команде тип_прерывания представляет собой номер прерывания, которых в ЭВМ IBM насчитывается 256 (типы прерываний имеют номера 0-255).

В некоторых типах прерываний BIOS и DOS имеется много разновидностей, иногда более 10. Так, прерывание 33 (21Н) имеет около 100 разновидностей (это прерывание наиболее часто используется в программах пользователя). В таких случаях вид прерывания (внутри типа) определяется содержимым регистра AH.

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

Наиболее распространенным в программах пользователя является использование прерывания 21H, которое предназначено для вызова функций DOS. В нижеприведенной таблице 7 [5] описываются только некоторые из видов этого прерывания.

Таблица 7

Наиболее часто используемые виды прерывания 21Н

Зна-че-ние АН Операция Дополнительные входные регистры Выходные регистры
  Ожидание набора символа на клавиатуре с последующим изображением его на экране Не используются (AL) = символ
  Вывод символа на экран (DL)= ASCII-код символа Не использу-ются
  Чтение символа с клавиатуры (DL)=0FFH (AL) = символ
A Чтение клавиатурной строки в буфер (DS:DX)= адрес буфера, первый байт = размер буфера Второй байт буфера = число про-читанных символов
  Изображение строки на экране дисплея (DS:DX)= адрес строки, которая должна заканчиваться символом $ Не использу-ются

МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

 

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

GET_KEY MOV AH,01Н; считать символ

INT 21H

CMP AL,’Д’; считан Д?

JE YES; если да, то перейти к YES

CMP AL,’Н’; считан Н?

JE NO; если да, то перейти к YES

JNE GET_KEY; иначе возврат на чтение символа.

В приведенном фрагменте распознаются только прописные буквы Д и Н, если Вы хотите, чтобы распознавались и строчные буквы, добавьте в программу соответствующие команды!

Во многих приложениях, требуется, чтобы пользователь ввел строку с информацией, например, свое полное имя (ФИО). Для этой цели служит функция А прерывания 21Н. Чтобы воспользоваться этой функцией, в программе пользователя требуется зарезервировать в сегменте данных место для вводимой строки (в таблице это называется буфер строки). Количество выделяемых байтов должно быть на 2 больше максимального размера вводимой строки. Причем первый байт буфера должен задавать эту самую максимальную длину (фактически он будет содержать значение количества выделенных байтов памяти минус 2). Например, чтобы предусмотреть в программе ввод пользовательской строки из 50 символов, в сегменте данных нужно описать:

STRING DB 50, 51 DUP (?); первый байт в области – константа 50, за ней следуют незаполненные 51 байт для сообщения.

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

LEA DX, STRING; указатель на буфер поместить в DS:DX

MOV AH,0AH; вызвать функцию А

INT 21H; прочитать строку.

Функция А помещает количество фактически введенных символов во второй байт буфера STRING и не изменяет указатель DS:DX. Т.е. после выполнения команды INT первый информационный символ введенной строки находится по адресу (DX)+2.

Вряд ли хорошая пользовательская программа может обойтись без сообщений из программы. Это могут быть либо приглашения к вводу информации, либо сообщения о ходе выполнения программы. Такой сервис в программах на Ассемблере представляет функция 9 для работы с дисплеем. Приведем пример фрагмента программы для выдачи приглашения ‘Введите ФИО’. Для функции 9 необходимо, чтобы текст сообщения заканчивался символом $, поэтому в сегменте данных опишем:

MESS1 DB ‘Введите ФИО: $’.

В командном сегментном коде предусмотрим команды вызова функции 9:

LEA DX, MESS1

MOV AH,09Н

INT 21H.

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

MESS1 DB ‘Введите ФИО’, 0DH,0AH,’$’.

Пожалуй, самым важным в программе обработки данных является вывод на экран дисплея числовых результатов обработки. Двоичный код цифры отличается от символа этой цифры на 30h, в чем легко убедиться, изучив таблицу кодов ASCII (приложение Г). Например, если искомая позиция элемента записана в переменную poz, то фрагмент программы для вывода номера позиции на экран дисплея может быть следующим:

mov dl, poz

add dl, 30h

mov ah,02h

int 21h

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

- анализируем знак числа, если число отрицательное, выводим символ “-”, и преобразуем число, изменяя его знак на “+”;

- выделяем цифры числа, деля число на 10 до значения остатка меньшего 10;

- выделенные из числа цифры выводим последовательно, начиная со старшей, используя команды, описанные выше.

Фрагмент программы для вывода двузначного числа со знаком из байтовой переменной min может быть таким, как показано ниже:

mov al, min

cmp al,0; анализируем знак числа

jge m1

mov dl,'-'

mov ah,02h;выводим символ минуса

int 21h

neg al;меняем знак числа

m1: cbw;преобразуем байт в полное слово

div c;константа с объявлена в сегменте данных как c db 10

mov r, ah;запоминаем младшую цифру в r

mov dl,al;старшую цифру помещаем в dl

add dl, 30h; и выводим ее на экран

mov ah,02h

int 21h

mov dl,r;младшую цифру помещаем в dl

add dl, 30h; и выводим ее на экран

int 21h

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

 

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

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

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

4. Провести отладку программы и проверить получаемые результаты.

 

Требования к содержанию и оформлению отчета

 

Отчет должен включать:

а) титульный лист;

б) формулировку задачи работы с математической формализацией поискового алгоритма;

в) описание результатов выполнения пунктов 2-4:

• листинг программы;

• результаты выполнения программы с разными исходными данными (тесты программ) в виде сообщений о результатах работы на экране дисплея (Print Screen);

г) вывод, согласованный с задачей работы.

 

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

 

Лабораторная работа считается успешно выполненной, если:

· ожидаемые результаты обработки совпадают с фактическими результатами работы программы;

· отчет на бумажном носителе содержит все необходимые пункты согласно требованиям;

· студент дает аргументированные пояснения по всем приведенным в отчете пунктам задания;

· студент отвечает на контрольные вопросы преподавателя.

 

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

1. Какие программные конструкции используются в поисковых алгоритмах?

2. Поясните механизм прерывания.

3. Как в программах на Ассемблере реализуется вывод на экран сообщений из программы пользователя?

4. Как в программах на Ассемблере реализуется вывод числовых результатов на экран дисплея?

5. Как при выводе обеспечить переход на следующую строку?

Варианты заданий

 

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

а) элементы массива однобатовые;

б) элементы массива двухбайтовые.

2. В заданном двухмерном массиве целых знакопеременных чисел вычислить суммы отрицательных элементов в столбцах массива:

а) элементы массива однобатовые;

б) элементы массива двухбайтовые.

3. В заданном двухмерном массиве целых знакопеременных чисел вычислить суммы положительных элементов в строках массива:

а) элементы массива однобатовые;

б) элементы массива двухбайтовые.

4. В заданной двухмерной матрице размерностью 5*5 целых знакопеременных чисел вычислить суммы элементов на главной и побочной диагоналях. Определить, какая из сумм больше и на сколько:

а) элементы массива однобатовые;

б) элементы массива двухбайтовые.

5. В заданном двухмерном массиве целых знакопеременных чисел вычислить разность между суммами положительных и отрицательных элементов в строках массива:

а) элементы массива однобатовые;

б) элементы массива двухбайтовые.

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

а) элементы массива однобатовые;

б) элементы массива двухбайтовые.

 

Список литературы

 

1. Assembler / В. Юров – СПб.: Питер,2002 – 624 с.

2. Абель П. АССЕМБЛЕР. Язык и программирование для IBM PC. Перевод с англ. под ред. С. М. Малявко Киев: «Век+», 2005. – 734 с.

3. Бройдо В.Л. ПЭВМ: Архитектура и программирование на ассемблере. СПб.: СПб.ГИЭА, 1994. – 218 с.)(сть позднее)

4. Югов В.Ю., Хорошенко С. Assembler: учебный курс. СПб.: Питер, 1999. – 672 с.

5. Л. Скэнлон. Персональные ЭВМ IBM PC и XT. Программирование на языке Ассемблера: Пер. с англ. – 2-е изд., стереотип. – М.: Радио и связь. 1991. –336 с.- старая

6. Бройдо В.Л. Вычислительные системы, сети и телекоммуникации. – СПб.: Питер, 2002. – 688 с. оставить

 


Приложение А

Программная модель микропроцессора Intel (Pentium III)

 

Регистры общего назначения

целочисленного устройства

Адресное пространство памяти   стек
AX

 

AH AL
eax

 

 
 


DH DL
edx

 
 


CX

CH CL
ecx

ss:esp

BX
0

ebx

 


31 16 15 0 Сегментные регистры

 
 
CS

 


DS
Индексные регистры

       
 
   
ES
 


SS
SI

DI

       
   
 
SP
 

 

 


31 16 15 0 15 0

 

Регистры устройства с Регистры состояния

плавающей точкой (сопроцессора) и управления

FL
ST(0)
eflags

 

ST(1)
31 16 15 0

IP
eip

.

. Системные регистры

.

 
 
ST(7)

 


79 0

Регистры ММХ-расширения

Целочисленные с плавающей точкой

       
 
MMXi
 
XMMi

 


63 0 127 0


Приложение Б

Синтаксис и функции псевдооператоров (директив)

Псевдооператор Формат и Функция
   
Определения данных DB [имя] DB выражение [,…….] определяет переменную или присваивает ячейке памяти начальное значение. Резервирует 1 или более байт (при наличии запятых)
DW [имя] DW выражение [,…….] аналогично предыдущему резервирует двухбайтовые слова
DD [имя] DD выражение [,…….] Резервирует 4-х байтовые двойные слова
Определения сегмента или процедуры SEGMENT   Имя_cer SEGMENT [тип_выравнивания (подгонки)] [тип_связи] [‘класс’] .... Имя_cer ENDS Определяет границы сегмента программы.
Связь имен сегментов с сегментными регистрами ASSUME ASSUME регистр_cer: Имя_cer [,…….] Или ASSUME регистр_cer: NOTHING Cообщает Ассемблеру, какой регистр сегмента связан с соответствующим сегментом программы. Оператор ASSUME регистр_cer: NOTHING отменяет действие всех предыдущих операторов ASSUME для данного регистра
Описание продедуры PROC Имя PROC [NEAR] или Имя PROC FAR .... RET имя ENDP Присваивает имя последовательности операторов. Должно иметь начало PROC и окончание ENDP
Внешние ссылки PUBLIC PUBLIC идентификатор Делает определенный ранее идентификатордоступным другим модулям программы, которые впоследствии должны быть присоединены к данному модулю
Управление трансляцией END END [метка точки входа] Отмечает конец исходной программы
Определение внешнего имени EXTERN EXTERN имя: тип [, ….] Указывает, что имя определено в другом модуле программы
Вставка в программу INCLUDE   INCLUDE файл вставляет содержимое указанного файла в текущий файл исходной программы
   
Определение идентификаторов EQU Имя EQU текст или Имя EQU числовое_выражение Постоянно присваивает идентификатору имя текст или числовое_выражение Имя = числовое_выражение Числовое_выражение присваивается идентификатору имя, но может быть переприсвоено

 

Приложение В

 

Имя Директива определения значения комментарий
BYTE1 DB ? Без указания значения
BYTE2 DB   Десятичная константа
BYTE3 DB 30Н 16-теричная константа
BYTE4 DB 01111010В Двоичная константа
BYTE5 DB 10 DUP(0) Десять нулевых значений
BYTE6 DB ‘Input simbol’ Строка символов
BYTE7 DB ‘12345’ Строка цифровых символов
BYTE8 DB 01, ‘Jan’, 02, ‘Feb’, 03, ‘mar’, 04,.... Таблица месяцев года, состоит и зномера месяца и его сокращенного названия
WORD1 DW 0fff0h 16-теричная константа
WORD2 DW 01111010В Двоичная константа
WORD3 DW BYTE3 Адрес переменной
WORD4 DW 2,3,4,5,6 Таблица из 5 констант
WORD5 DW 8 DUP(0) Восемь нулевых значений
DWORD1 DD ? Без значения
DWORD2 DD   Десятичное значение
DWORD3 DD 48Н, 24Н, СА 16-теричные константы
DWORD4 DD WORD1 Адрес слова в виде сегмент:смещение

 


Приложение Г

 

Формат арифметических команд

Функция команды Формат
Команды сложения Приемник=приемник +источник ADD приемник, источник
Приемник=приемник +источник +CF(перенос) ADC приемник, источник
Корректировка неупакованного BCD-числа AAA
Корректировка упакованного BCD-числа DAA
Инкремент: приемник=приемник+1 INC приемник
Команды вычитания Приемник=приемник-источник   SUB приемник, источник
Приемник=приемник -источник -CF(заем) SBB приемник, источник
Корректировка неупакованного BCD-числа AAS
Корректировка упакованного BCD-числа DAS
Декремент: приемник=приемник-1 DEC приемник
Изменение знака: приемник= – приемник NEG приемник
Сравнить и установить флаги приемник – источник CMP приемник, источник
Команды умножения Умножение целых чисел без знака   MUL источник
Умножение целых чисел со знаком IMUL источник
Корректировка неупакованного BCD-числа AAM
Команды деления Деление целых чисел без знака   DIV источник
Деление целых чисел со знаком IDIV источник
Корректировка неупакованного BCD-числа AAD
Команды расширения знака Преобразовать байт в регистре AL в слово в регистре АХ   CBW
Преобразовать слово в регистре AX в двойное слово в регистрах DX:АХ CWD

 


 

CSEG SEGMENT PARA PUBLIC ‘CODE’

ASSUME CS:CSEG, DS:DSEG, SS:STACK

Установить индекс-ные регистры
OUR_PROG PROC FAR

PUSH DS

SUB AX,AX

Инициализация счет-чика внешнего цикла
PUSH AX

MOV AX,DSEG

MOV DS,AX

XOR SI,SI

Запоминание счет-чика внешнего цикла
XOR DI,DI

XOR BX,BX

MOV CX, LEN_MAS/LEN_STR

 
 
Инициализация счет-чика внутрен. цикла


VN_CYCL: PUSH CX

 
 


MOV CX, LEN_STR

 
 
Установить указатель на начало строки


XOR SI,SI

 
 

 


Добавить значение очередного элемента к сумме
VNUTR_ CYCL:

MOV AL, MAS[BX][SI]

ADD SUM[DI],AL

 

 
 

 


INC SI

 

 
 

 

 


НЕТ LOOP VNUTR_ CYCL

 
 

 

 


ДА

 
 
Восстановление счетчика внешнего цикла


POP CX

 

 

 
 


Перейти к следу-ющей строке
INC DI

ADD BX, LEN_STR

LOOP VN_ CYCL

RET

OUR_PROG ENDP

CSEG ENDS

НЕТ ДА END OUR_PROG

       
   



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 249; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.168.172 (0.133 с.)