УПРАВЛЕНИЕ КУРСОРОМ ПРИ ВЫВОДЕ. ВЛОЖЕННЫЕ ЦИКЛЫ. ФОРМИРОВАНИЕ И ВЫВОД НА ЭКРАН ТАБЛИЦЫ СИМВОЛОВ ASCII 



Теоретические сведения

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

07h (BEL) — звуковой сигнал (со стандартного звукового устройства);

08h (BS) — BackSpace (курсор сдвигается на 1 позицию влево);

09h (HT) — горизонтальная табуляция (курсор сдвигается к ближайшей правой границе табуляции);

 10 = 0Ah (LF) — перевод строки (курсор сдвигается на строку вниз, оставаясь в той же позиции);

 13 = 0Dh (CR) — возврат каретки (курсор сдвигается в начало текущей строки).

Управляющие коды дают возможность выводить на экран форматированный текст в режиме телетайпа. Текстовый экран при этом обычно состоит из 25 строк по 80 символов. Строки нумеруются с 1-й (верхняя) по 25-ю (нижняя). Если курсор находится в последней позиции строки, вывод символа приводит к автоматическому переводу курсора в начало новой строки. Если курсор находится в предпоследней (25-й) строке, то его перевод на следующую строку приводит к сдвигу изображения на строку вверх.

При перенаправлении вывода интерпретация управляющих кодов может меняться.

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

 

     mov al, 0       ; инициализация переменной внешнего цикла

metka1:                    ; начало внешнего цикла

     mov ah, 0       ; инициализация переменной внутреннего цикла

metka2:                    ; начало внутреннего цикла

     inc ah          ; изменение AH

     cmp ah, N

     jb metka2      ; конец внутреннего цикла

     inc al          ; изменение AL

     cmp al, M

     jb metka1      ; конец внешнего цикла

 

 

В случае же использования одной ячейки для переменных обоих циклов (как, например, при использовании команды LOOP для обоих циклов) необходимо организовать сохранение и восстановление актуальных значений этой переменной для внешнего цикла. Для этого удобно использовать стек (команды PUSH и POP):

 

; Внешний цикл, повторяющийся N раз

      mov cx, N

metka1:

      push cx      ; сохранение счетчика внешнего цикла в стеке

; Внутренний цикл, повторяющийся M раз

      mov cx, M

metka2:

      ...             ; (тело внутреннего цикла)

      loop metka2

      ...             ; (тело внешнего цикла)

      pop cx      ; восстановление счетчика внешнего цикла

      loop metka1

 

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

Задание

Используя вложенные циклы, сформировать и вывести на экран таблицу ASCII-символов с кодами в указанном диапазоне. Для формирования и вывода воспользоваться одним из 3-х указанных способов:

1) формирование и вывод одного символа во вложенном цикле (используется ячейка для одного символа);

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

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

Направление последовательности символов указывает, в направлении строк или же столбцов будут увеличиваться коды символов в таблице, а длина (n) последовательности — количество символов в одной строке или одном столбце соответственно. При этом каждая последовательность (кроме, возможно, первой) должна начинаться с символа с кодом, кратным n.

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

 

Варианты:

 

№ вар. диапазон кодов символов направление и длина (n) последовательности способ формирования и вывода
1. 32 – 255 строки по 15 символов 1
2. 56 – 246 столбцы по 10 символов 2
3. 72 – 244 строки по 20 символов 3
4. 34 – 198 строки по 25 символов 1
5. 38 – 204 столбцы по 16 символов 2
6. 43 – 228 строки по 30 символов 3
7. 34 – 184 столбцы по 8 символов 1
8. 39 – 147 строки по 16 символов 3
9. 42 – 164 столбцы по 15 символов 1
10. 31 – 255 строки по 24 символов 2
11. 51 – 219 столбцы по 12 символов 3
12. 64 – 203 строки по 28 символов 1
13. 30 – 252 строки по 35 символов 2
14. 48 – 219 столбцы по 20 символов 3

 

Пример задания: диапазон кодов — 35 - 179; направление последовательности — по столбцам; длина последовательности n = 14 (по 14 символов в столбце).

Первый столбец будет иметь позиции для кодов с 2 * 14 = 28 до 3 * 14 – 1 = 41. Первый символ с кодом 35 (решетка) будет занимать 8-ю позицию первого столбца. Второй столбец начнется с кода 3 * 14 = 42 (звездочка); третий — с кода 4 * 14 = 56 ('8') и т. д. Всего потребуется (179 – 35) / 14 + 1 = 11 столбцов (ориентировочный подсчет), причем последний столбец будет неполным (без символов с кодами 180 и 181).

Результат:

  * 8 F T b p ~ М Ъ и
  + 9 G U c q Н Ы й
  , : H V d r А О Ь к
  - ; I W e s Б П Э л
  . < J X f t В Р Ю м
  / = K Y g u Г С Я н
  0 > L Z h v Д Т а о
# 1 ? M [ i w Е У б п
$ 2 @ N \ j x Ж Ф в
% 3 A O ] k y З Х г
& 4 B P ^ l z И Ц д
' 5 C Q _ m { Й Ч е
( 6 D R ` n | К Ш ж  
) 7 E S a o } Л Щ з  

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


Дата добавления: 2018-04-05; просмотров: 373; Мы поможем в написании вашей работы!

Поделиться с друзьями:






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