Читайте также:
|
|
Задание на разработку.
Имеется электронное табло длиной 10 знакомест. В памяти записана фраза, которую требуется вывести. Фраза записана в массив 8-и разрядных данных, начинающийся с ячейки 2210h, длиной 100 байт. Незанятые байты массива содержат нули. Составить программу вывода бегущей строки в электронное табло. При этом по адресу F3h задается позиция знакоместа на табло (отсчет начинается с 0), а по адресу F4h задается выводимый символ.
Программа будет состоять из нескольких вспомогательных функций.
Функция pause – определяет задержку сдвига выводимого текста.
Функция fill_tablo – заполняет табло значениями из массива со сдвигом, указанным в регистре B.
Функция char_out – выводит один символ, расположенный по адресу HL в позицию табло, заданную в регистре C.
Сначала рисуем блок-схему основного цикла программы и вспомогательных функций.
Основной цикл | Функция вывода на табло | Функция паузы Вывод символа |
Паузу в 1 секунду формируем за счет выполнения операции вычитания, занимающей 5 машинных тактов. Учитывая, что производительность процессора составляет 300 тыс. операций (тактов) в секунду, требуется 60 тыс. циклов вычитания.
Затем, составляется программа на языке ассемблера.
LXI | H, 2210h | ; Устанавливаем указатель на начало массива | |
MVI | B, 00h | ; Устанавливаем позицию первого выводимого символа | |
Out_1: | Call | Fill_Tablo | ; Записываем 10 символов фразы на табло |
Call | Pause | ; Выдерживаем паузу в 1 секунду | |
INC | B | ; Сдвигаем указатель начала выводимой фразы | |
PUSH | H | ; Сохраняем указатель на начало массива | |
MOV | A, B | ||
ADD | L | ; Прибавляем к HL значение аккумулятора | |
MOV | A, M | ; M – Memory. Загружаем в регистр А значение, расположенное по адресу, указанному в HL | |
JNZ | NotZero | ; Если не достигнут последний символ, выводим очередной | |
MOV | B, 00h | ; Если достигнут 0 – выводим фразу с начала | |
NotZero: | POP | H | ; Восстанавливаем начало массива |
JMP | Out_1 | ; Повторяем цикл вывода фразы бесконечно | |
; Fill_Tablo – вывод 10-и символов фразы на экран | |||
Fill_Tablo: | PUSH | H | ; Сохраняем указатель на начало массива |
MOV | A, B | ; Сохраняем в аккумулятор рабочее значение сдвига вывода фразы | |
MVI | C, 0Ah | ; Будем выводить 10 символов из массива | |
ADD | L | ; Прибавляем к HL значение аккумулятора | |
NextChar: | MOV | A, M | ; M – Memory. Загружаем в регистр А значение, расположенное по адресу, указанному в HL |
JNZ | NotZero1 | ; Если не достигнут последний символ, выводим очередной | |
LXI | H, 2210h | ; Устанавливаем указатель на начало массива | |
NotZero1: | Call | Char_Out | ; Выводим символ |
INX | H | ; Подготавливаем следующий символ для вывода | |
DCR | C | ; Подготавливаем следующее знакоместо | |
JNZ | NextChar | ; Делаем 10 циклов | |
POP | H | ; Восстанавливаем значение начала массива | |
RET | ; Возвращаемся в основную программу | ||
; Функция вывода символа на экран. Адрес символа – в HL, номер знакоместа в C | |||
Char_Out: | MOV | A, C | ; Загружаем номер знакоместа |
OUT | F3h | ; Устанавливаем во внешнем устройстве вывода номер знакоместа | |
MOV | A, M | ; Загружаем символ, находящийся по адресу HL | |
OUT | F4h | ; Выводим на табло загруженный в регистр А символ | |
RET | ; Возвращаемся в функцию Fill_Tablo | ||
; Функция установки паузы продолжительностью 1 секунду | |||
Pause: | PUSH | B | ; Регистр BC временно нужен для другой цели, поэтому сохраняем его в стеке |
Label1: | LXI | B, EA60h | ; 60000 циклов по 5 тактов обеспечат секундную паузу |
DCX | B | ; Вычитаем до тех пор… | |
JNZ | Label1 | ; … пока значение не станет равно 0 | |
POP | B | ; Восстанавливаем значение регистра BC | |
RET | ; Возвращаемся в основную программу |
ПРАКТИЧЕСКИЕ ЗАНЯТИЯ ПО КОМАНДАМ ОПЕРАЦИОННОЙ СИСТЕМЫ UNIX
(для группы ТО-21 от 30.05.2012 г.)
Содержание практических занятий
1. Методические указания по основным командам UNIX
2. Команды по работе с файловой системой
3. Команды по работе с текстом
4. Резюме
Дата добавления: 2014-12-19; просмотров: 31 | Поможем написать вашу работу | Нарушение авторских прав |