Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Исследование процессов вводавывода информации и системы арифметических команд x86 микропроцессоров семейства Intel. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
949 Кб
Скачать

В заключение отметим, что для вывода информации на экран в текстовом режиме могут использоваться и другие функции DOS, такие как 06h, 09h, 40h, а также средства BIOS, подробно рассмотренные в [2].

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

1.Какая информация может располагаться в сегменте данных?

2.Как должен начинаться и заканчиваться кодовый сегмент программы?

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

4.Какое прерывание и какая функция DOS используются для вывода строки символов на экран?

5.Для каких целей используется функция DOS – 02h?

6.Для каких целей служит оператор offset?

17. Что означает символ $, стоящий в конце строки подлежащей выводу на

STDOUT?

18. Как программным способом можно организовать временную задержку?

Лабораторная работа № 3 ИССЛЕДОВАНИЕ ПРОЦЕССА ВВОДА ИНФОРМАЦИИ В ПАМЯТЬ ПЭВМ С ПОМОЩЬЮ КОМАНДНОЙ СТРОКИ

Цель работы – изучить процесс ввода строки символов, расположенных в командной строке, в префикс программного сегмента с последующим выводом введённых символов на экран монитора.

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

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

пособии.

2. Последовательность выполнения работы Последовательность выполнения работы изложена выше (см.

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

ASSEMBLER).

51

Задание

В данной работе необходимо составить программу, которая выполняет следующие действия: в область сегмента данных вводятся несколько символов клавиатуры, набираемых в командной строке. После ввода символов в память на монитор с новой строки выводится сообщение: ’ Ввод символов клавиатуры в память ЭВМ с помощью командной строки’, составленное на английском языке. Затем введённые символы с новой строки выводятся на экран монитора. Внимание! В этом случае вначале имя файла с исполняемой программой (.exe файла) набирается в командной строке, затем в ней набираются символы клавиатуры, и только после этого нажимается клавиша Enter для выполнения программы. Например, после имени файла lab_2.exe можно напечатать предложение: ,’I am learning ASSEMBLER’, которое вводится в

память после нажатия клавиши Enter.

Дополнительная информация для составления программы по данному заданию

Напомним, что после нажатия клавиши Enter набранные в командной строке символы клавиатуры запишутся в префикс программного сегмента начиная с ячейки памяти под номером 81h. В ячейке 80h будет сформировано число, отражающее количество конкретно введенных символов в префикс программного сегмента. Следовательно, первое, что нужно сделать в кодовом сегменте программы, это передать введённые символы из PSP в сегмент данных. Для этого в области .data заранее формируется буфер, объёмом не более 255 байт, так как в префикс программного сегмента большее количество символов записать нельзя. Весь этот буфер предварительно заполняется символами ’$’ – окончание вывода.

Для перезаписи введённых символов в этот буфер в кодовом сегменте программы оператором offset необходимо занести начальный адрес буфера в индексный регистр si. Тогда на этот адрес будет указывать пара регистров ds:[si]. Напомним, что здесь

52

квадратные скобки означают, что в Вашей программе должна использоваться косвенная адресация при перезаписи указанных символов в сегмент данных. Для задания адреса символа в области PSP также необходимо использовать пару регистров es:[di]. При этом в индексный регистр di предварительно заносится начальный адрес массива символов в PSP – 81h с помощью команды mov di,81h. Как было отмечено раннее, вначале программы сегментные регистры es и ds настроены на начало PSP, но после первых двух обязательных команд программы

mov ax,@data и mov ds,ax

регистр ds настраивается на область данных .data, а регистр es всё ещё будет указывать на начало PSP. Отметим, что непосредственно передовать информацию из одной области памяти в другую нельзя. Передача байтов может происходить только через аккумулятор al, т.е. очередной байт из PSP вначале передаётся в аккумулятор, а затем уже в сегмент данных. Эту передачу всех символов необходимо организовать циклически с использованием регистра cx и команды loopnz метка. Для этого в регистр cx , а точнее в cl нужно передать содержимое ячейки 80h префикса программного сегмента, а старшую половину регистра – ch – обнулить. Отметим, что обнулить любой регистр, также как и ячейку памяти можно командой xor – ’исключающее ИЛИ’, например, xor cx,cx, а передачу содержимого ячейки – командой mov al,es:[80h]. Таким образом, только после перезаписи введенных символов в сегмент данных, а именно в отведённый для этих целей буфер, осуществляется вывод на экран монитора заданного сообщения и затем с новой строки вывод самих введённых символов клавиатуры.

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

1.Что такое PSP, где он располагается и для каких целей используется?

2.В какую область PSP вводятся данные из командной строки?

3.В какую ячейку памяти PSP записывается число реально введённых в

него символов клавиатуры и какое максимальное значение оно может иметь?

4.Сколько байт отводится в ASCII-коде под каждый символ клавиатуры?

53

5.На какую область памяти указывают сегментные регистры ds и es в начале выполнения программы?

6.На какие области памяти будут указывать регистры ds и es после выполнения команд программы mov ax,@data и mov ds,ax?

7.Что такое стек и какие команды используются при работе с ним?

8.Каким способом можно быстро настроить сегментный регистр es на область данных, если регистр ds уже на неё настроен?

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

10.Нужно ли при использовании ввода данных память с помощью командной строки организовывать буфер для ввода?

Лабораторная работа № 4 ИССЛЕДОВАНИЕ ПРОЦЕССА ВВОДА ИНФОРМАЦИИ

ВПАМЯТЬ ПЭВМ С ИСПОЛЬЗОВАНИЕМ КЛАВИАТУРЫ

ИФУНКЦИИ DOS 0Ah

Цель работы – изучить процесс ввода строки символов клавиатуры в буфер с помощью функции DOS 0ah, заранее организованный в сегменте данных объемом, не превышающим 255 байт, с последующим вывода введённых символов на экран монитора.

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

1. Подготовка к работе.

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

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

Последовательность выполнения работы изложена выше (см. Основные правила при разработке программ на языке ASSEMBLER).

Задание

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

54

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

Вход:

ah=0ah

:

ds:dx=адрес буфера

Выход:

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

Для вызова этой функции надо подготовить буфер, первый байт которого заключает в себе максимальное число символов для ввода (1

– 255). После нажатия клавиши Enter строка c символами клавиатуры (включая последний символ CR(0dh)) записывается в буфер начиная с третьего байта. Во второй байт записывается длина реально введённой строки без учёта последнего символа CR. Таким образом, для того чтобы вывести на экран ранее введенные символы клавиатуры, необходимо в регистре dx задать адрес первого введённого в буфер символа, а в регистре cx – количество реально введённых символов. Для задания начального адреса буфера, как и ранее, можно воспользоваться оператором offset, а затем сместить указатель адреса на два байта. Это можно сделать применив команду арифметического сложения содержимого регистра dx и числа 2, либо применив два раза команду inc к регистру dx.

В данной работе необходимо составить программу, которая после её запуска выводит на экран монитора сообщение: ’Ввод информации с клавиатуры в память ЭВМ’. Далее программа останавливается и ждет ввода символов с клавиатуры. Например, можно ввести предложение ’Я изучаю ассемблер’, символы которого при вводе будут печататься на экране монитора. Необходимо обеспечить их печатанье с новой строки. После нажатия клавиши Enter набранные символы введутся в память. Отметим, что вся вводимая и выводимая информация печатается на английском языке. Для проверки правильности ввода Ваша программа должна обеспечить их последующий вывод на экран монитора с новой строки. Перед выводом символов напечатать сообщение: ’ Вывод символов клавиатуры из памяти ЭВМ’. Перед окончанием программы сформировать временную задержку для наблюдения результатов работы программы так же, как в программах при выполнении предыдущих заданий.

55

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

1.С помощью какой функции DOS в сегмент данных вводится строка символов клавиатуры?

2.Какую структуру имеет буфер под вводимую строку символов клавиатуры?

3.Какое максимальное число символов строки можно ввести в этот буфер?

4.Записывается ли символ CR в буфер ввода строки данных?

Лабораторная работа № 5 ИССЛЕДОВАНИЕ ПРОЦЕССА ПРЕОБРАЗОВАНИЯ

ВВЕДЁННОЙ В ПЭВМ ИНФОРМАЦИИ ДЛЯ ЕЁ ВЫВОДА НА ЭКРАН МОНИТОРА В ОБРАТНОМ ПОРЯДКЕ

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

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

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

работе № 4.

2. Последовательность выполнения работы Последовательность выполнения работы изложена выше (см.

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

ASSEMBLER).

Задание

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

56

информации также снабдить сообщением, например, ‘Вывод строки символов в обратном порядке’.

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

1.Входит ли этот символ в число реально введенных символов, которое регистрируется в буфере?

2.В каком байте буфера регистрируется это число?

3.Обязательно ли предварительно заполнять буфер символом $?

4.Символы строки вводятся в буфер сразу целой строкой или по отдельности по мере их набора на клавиатуре при использовании функции 0ah?

Лабораторная работа № 6 ИССЛЕДОВАНИЕ ПРОЦЕССА ВВОДА ИНФОРМАЦИИ

ВПАМЯТЬ ПЭВМ С ИСПОЛЬЗОВАНИЕМ КЛАВИАТУРЫ

ИФУНКЦИИ DOS 01h

Цель работы – изучить процесс ввода строки символов клавиатуры с помощью функции DOS 01h в буфер, расположенный в сегменте данных и размер которого превышает 255 символов, для их последующего вывода на экран монитора.

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

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

лабораторной работе № 5.

2. Последовательность выполнения работы Последовательность выполнения работы изложена выше (см.

Основные правила при разработке программ на языке ASSEMBLER).

Задание

Используемая в предыдущей лабораторной работе № 5 функция 0ah представляет удобный, но ограниченный способ ввода данных. Например, с помощью этой функции нельзя ввести в память ЭВМ информацию, превышающую 255 символов клавиатуры. Поэтому

57

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

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

Вход: ah=01h

Выход: al=ASCII – код символа или 0. Если al=0, второй вызов этой функции возвратит в al расширенный ASCII – код символа.

При чтении с помощью этой функции введённый символ автоматически отображается на экране (посылается в устройство STDOUT, так что его можно перенаправить в файл). При нажатии Ctrl–C или Ctrl–Break выполняется команда int 23h – выход из программы.

Таким образом, в данном задании необходимо составить программу, которая, используя функцию DOS – 01h, вводит строку символов клавиатуры в память ЭВМ с последующим выводом их на экран монитора. В этом случае количество вводимых символов в буфер также удобно задавать в регистре cx и использовать команду loopnz. Как и в предыдущих программах, ввод/вывод информации сопроводить необходимыми сообщениями. Кроме того, исследуйте реакцию программы при вводе данных с клавиатуры, если во время набора символов нажать клавиши:

1)Ctrl–Break;

2)Ctrl–C;

3)Backspace;

4)Enter;

5)клавиши со стрелками и некоторые др. Сделайте соответствующие выводы.

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

память ЭВМ, проверки её на нажатие клавиши имеются и другие функции DOS, такие как 06h, 07h, 08h, 0bh, 0ch, а также средства BIOS, подробно рассмотренные в [2].

58

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

1.Будет ли реагировать программа на нажатие клавиш Ctrl – Break и Ctrl – C при использовании функции DOC – 0ah?

2.Какое назначение имеет функция DOS – 01h?

3.Ограничивается ли размер буфера 255 вводимыми символами клавиатуры при использовании этой функции?

4.Как реагирует программа при использовании функции DOC – 0ah на нажатие клавиш Backspace, Enter, Ctrl–Break и Ctrl–C в момент ввода основных символов клавиатуры?

Лабораторная работа № 7 ИССЛЕДОВАНИЕ ПРОЦЕССА СУММИРОВАНИЯ

НА ПЭВМ ОДНОБАЙТОВЫХ ЧИСЕЛ

С ИСПОЛЬЗОВАНИЕМ КОМАНДЫ add al,[si]

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

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

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

пособии в разделе «Арифметические команды». 2. Последовательность выполнения работы

Последовательность выполнения работы изложена выше (см. Основные правила при разработке программ на языке ASSEMBLER).

Задание

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

59

Повторить то же самое для чисел со знаком. Отрицательный результат выводить на экран монитора, как в прямом, так и в дополнительном коде.

Отметим, что отрицательные числа в ЭВМ автоматически представляются в дополнительном коде. Признаком отрицательного числа является наличие “1” в знаковом разряде числа.

Рекомендации по выполнению лабораторной работы

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

CALL имя подпрограммы

Рекомендуется выводить результаты различных вычислений с новой строки.

Тексты подпрограмм вывода на экран

Данная подпрограмма выводит на экран один нибл.

Вход: al – содержит в младшей половине выводимый нибл, старшая половина регистра игнорируется.

Выход: нет, все регистрысохраняют свои первоначальные значения. DisplayNibl PROC NEAR; ближняя процедура запоминания

push ax

; изменяемыхрегистров

push dx

 

and al,0fh

; очисткастаршего нибла

add al,’0’

; формированиесимвола

cmp al,’9’

 

jbe dn1

 

add al,7

 

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]