Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Asm_Tasks_4k.doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
204 Кб
Скачать
☆

9. Итоговые задания

Задание 1. Работа с кодом Морзе

Предлагается написать программу, перекодирующую текстовое сообщение (строку) в код Морзе либо программу, по коду Морзе восстанавливающую исходную строку.

Краткая историческая справка (прочитать обязательно!). Американец Сэмюэль Морзе (Samuel Morse) в 1837 году изобрёл телеграфный аппарат для передачи информации с помощью сигналов двух видов - точек и тире. В аппарате Морзе принятая телеграмма записывалась на бумажную ленту. Своё «второе рождение» код Морзе получил после изобретения радиосвязи в 1895 году (А.С Попов - Россия, Г. Маркони - Италия), когда была обнаружена возможность приёма телеграфных радиограмм на слух, без предварительной записи. К середине XX века телеграфные аппараты Морзе были практически вытеснены буквопечатающими аппаратами, однако определённый интерес к коду Морзе появился вновь после изобретения микропроцессоров и микроконтроллеров. В настоящее время код (азбука) Морзе продолжает применяться в радиолюбительской связи (CW-связь), а также в аварийно-спасательных системах в качестве запасного средства. Радиосигналы Морзе удаётся принимать даже при наличии таких сильных помех, когда никакой другой вид радиообмена невозможен.

В коде Морзе каждый символ (буква, цифра, знак препинания) представлен в виде комбинации двух знаков - точек и тире. Количество этих знаков может быть от 1 до 6, то есть код Морзе - это пример неравномерного кода. За единицу времени при передаче принята продолжительность точки. Продолжительность тире должна быть равна трём точкам. Продолжительность паузы между знаками - одна точка, между символами - три точки, между словами - семь точек. Мы видим, что код Морзе - не двоичный код, как иногда принято считать: его алфавит содержит не два, а целых пять знаков - точка, тире и три вида пробелов.

Цифровая аппаратура работает с битами и байтами. Как же представить с их помощью код Морзе? Для упрощения задачи ограничимся только буквами (без цифр и служебных символов). Один из возможных способов состоит в том, что каждая буква, как и в коде ASCII, представляется одним байтом. Младший полубайт (4 бита) пусть содержит количество знаков - точек и тире - в данной букве. Старший полубайт (ещё 4 бита) будет содержать саму последовательность точек и тире для данной буквы, причём точку будем кодировать нулём, а тире - единицей и записывать эту последовательность, начиная с крайнего левого бита. Поскольку количество точек и тире в букве (за редким исключением) не превышает 4, нам как раз хватит этих четырёх бит.

Пример. Буква «А» кодируется по Морзе как «точка-тире». Количество знаков - два, число 2 в двоичной системе - это 10, отсюда младший полубайт = 0010. Старший полубайт будет содержать 0100, так как «точка» - это 0, «тире» - это 1, остальные биты не используются и остаются нулями. Байт 0100 0010 переводим в шестнадцатеричную систему и получаем 42h - это и есть представление буквы «А». Итак, всё вместе:

А = ( -) = 0100 0010 = 42h

Непонятно? Тогда вот ещё примеры (буквы из четырёх знаков):

Б = ( - ) = 1000 0100 = 84h

Ж = ( -) = 0001 0100 = 14h

Рассуждая таким образом, заполняем таблицу. Здесь информация расположена в порядке следования букв русского алфавита (без буквы «Ё»):

Таблица 1

А

A

. -

0100 0010

42h

Р

R

. - .

?

?

Б

B

- . . .

1000 0100

84h

С

S

. . .

?

?

В

W

. - -

0110 0011

63h

Т

T

-

?

?

Г

G

- - .

1100 0011

C3h

У

U

. . -

?

?

Д

D

- . .

1000 0011

83h

Ф

F

. . - .

?

?

Е

E

.

0000 0001

01h

Х

H

. . . .

?

?

Ж

V

. . . -

0001 0100

14h

Ц

C

- . - .

?

?

З

Z

- - . .

1100 0100

C4h

Ч

нет

- - - .

*

*

И

I

. .

0000 0010

02h

Ш

нет

- - - -

*

*

Й

J

. - - -

0111 0100

74h

Щ

Q

- - . -

?

?

К

K

- . -

1010 0011

A3h

Ъ

нет

. - - .-.

Л

L

. - . .

0100 0100

44h

Ы

Y

- . - -

?

?

М

M

- -

1100 0010

C2h

Ь

X

- . . -

?

?

Н

N

- .

1000 0010

82h

Э

нет

. . - . .

*

*

О

O

- - -

1110 0011

E3h

Ю

нет

. . - -

*

*

П

P

. - - .

0110 0100

64h

Я

нет

. - . -

*

*

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

Итак, мы получили последовательность байтов, которую теперь запишем в порядке следования букв латинского (английского) алфавита:

Таблица 2

A

B

C

D

E

F

G

H

I

J

и так далее…

Z

42

84

A4

83

01

24

C3

04

02

74

(заполните самостоятельно!)

C4

Эту последовательность из 26 чисел мы занесём (вручную) в память нашей микропроцессорной системы, например, в сегмент ES, начиная с какого-либо базового адреса, допустим, 100h. Это будет наша Таблица Перекодировки.

Теперь всё готово для выполнения упражнений.

Вариант 1. Исходная строка текста на английском языке (например, QSL RCV - «подтверждаю приём Вашего сообщения!») для передачи кодом Морзе должна быть вручную записана в память с адреса DS:0000h (следует воспользоваться кнопкой «Текст…» на вкладке «Память» программы AsmEd). Разработать программу, которая будет выводить на виртуальный дисплей соответствующую строку из точек, тире и пробелов. Код символа «точка» - 02Eh, «тире» - 02Dh, «пробел» - 020h. При этом в программе AsmEd должна быть включена DOS-кодировка (меню «Вид»-«Настройка»-«Символы»). Точки и тире выводить вплотную друг к другу (без пробела). Между буквами выводить один пробел, между словами - два пробела (здесь мы несколько отступаем от стандарта в целях упрощения задачи и улучшения вида картинки на экране). Алгоритм решения задачи в «крупных командах» может выглядеть так:

  1. Читать символ из строки (обозначим его код - SYM)

  2. Это пробел (SYM=020h)? Если да, то выдать на экран код 020h и перейти к п.8

  3. Извлечь из Таблицы Перекодировки код (=N), соответствующий символу SYM

  4. Выделить младший полубайт (= K) из кода N

  5. Положить номер бита B равным 7

  6. Повторить K раз:

    1. Выделить бит ( = BIT) номер B из кода N

    2. Если BIT = 0, то выдать на экран код 02Eh

    3. Если BIT = 1, то выдать на экран код 02Dh

    4. Уменьшить номер анализируемого бита B на единицу

  7. Выдать на экран код 020h - пробел после окончания обработки символа

  8. Есть ещё символы в исходной строке? Если да, то перейти к п.1

  9. Закончить работу

У автора этого пособия соответствующая программа на Ассемблере заняла около 40 строк. А сколько получится у Вас?

Вариант 2. Цифры представляются кодом Морзе следующим образом:

Таблица 3

1

. - - - -

6

- . . . .

2

. . - - -

7

- - . . .

3

. . . - -

8

- - - . .

4

. . . . -

9

- - - - .

5

. . . . .

0

- - - - -

Разработать какой-либо свой способ представления этих кодов в памяти компьютера (микропроцессорной системы). Здесь, очевидно, для хранения информации о знаках одним полубайтом обойтись уже нельзя. По аналогии с Вариантом 1 написать программу, которая читает из памяти (с адреса DS:0000h) строку из десятичных цифр и выдаёт её на экран (виртуальный дисплей) в виде кода Морзе.

Вариант 3. Пусть имеется строка символов, содержащая не только латинские, но и русские (но без литеры «Ъ») буквы. По аналогии с Вариантом 1 написать программу, которая читает из памяти (с адреса DS:0000h) эту строку и выдаёт её на экран (виртуальный дисплей) в виде кода Морзе. Продумать способ представления кодов букв, обозначенных звёздочками в Таблице 1 (сложности могут возникнуть из-за буквы «Э»).

Задание 2. Работа с моделями графических изображений

В памяти компьютера записана последовательность байтов, представляющая то или иное графическое изображение. Декодировать его и выдать на виртуальный дисплей, изображая каждый пиксель псевдографическим символом с кодом 219 = 0DBh, представляющим собой закрашенный прямоугольник. При этом в программе AsmEd должна быть включена DOS-кодировка (меню «Вид»-«Настройка»-«Символы»), задержка автовыполнения должна быть выключена (равна 0).

Вариант 1. Одноцветное изображение без сжатия.

Изображение построено в квадратной матрице 8х8, состоит соответственно из восьми строк и каждая строка кодируется одним байтом: если тот или иной бит равен 0, то пиксель выводится одним цветом (например, зелёным - это цвет фона), если бит равен 1 - другим цветом (например, красным - это цвет самого изображения).

Пример одной строки:

= 0 1 0 1 1 0 0 1 = 59h

Алгоритм вывода такого изображения на экран виртуального дисплея системы AsmEd:

1. Записать в регистр SI адрес начала массива графических данных

2. Записать в регистр DI адрес начала видеопамяти (в системе AsmEd - 0F600h)

3. Повторить 8 раз:

a. Прочитать очередной байт ( = GB) из сегмента данных по адресу SI

b. Положить номер бита ( = B) равным 7

c. Повторить 8 раз:

c1. Выделить бит ( = BIT) номер B из байта GB

c2. Если BIT=1, то вывести по адресу DI красный прямоугольник (пиксель)

c3. Если BIT=0, то вывести по адресу DI зелёный прямоугольник (пиксель)

c4. Уменьшить номер анализируемого бита B на единицу

c5. Увеличить DI на следующую позицию экрана (видеопамяти)

(конец цикла)

d. Перейти (увеличением DI) на следующую строку экрана

e. Увеличить SI для указания на следующий байт данных

(конец цикла)

4. Закончить работу

Исходные данные для построения изображений (несколько примеров):

№ п/п

Данные (восемь байт)

Название

Автор картинки

I

DB 81 18 A5 A5 18 81 DB

орнамент

Босова Л.Л. (метод. пособие 5-6 кл.)

II

40 C1 C1 7F 7E 24 24 48

собачка

Свистова Катя (класс 6А, с.ш. № 24)

III

99 5A 3C FF FF 3C 5A 99

жучок

Тюменева Ксюша (класс 6А, с.ш. № 24)

IV

00 A3 E1 79 3E 7E C4 8C

волчонок

Елисеева Маша (класс 6А, с.ш. № 24)

V

3C 42 95 81 85 8D 42 3C

рожица

Нуриева Афгана (класс 6А, с.ш. № 24)

VI

2A 2A 2A 1C 08 08 08 08

трезубец

Нуриева Афгана (класс 6А, с.ш. № 24)

VII. Более сложное задание - изображение из 10 строк по 16 клеток (пикселей) в строке:

50 0E F8 01 A8 01 F8 02 77 FC 23 FC 03 FE 02 02 02 02 0C 0C (кошечка)

Здесь каждые два соседних байта описывают свою строку (50, 0E - первая строка; F8, 01 - вторая и т.д.). Напишите соответствующий алгоритм и программу!

Вариант 2. Многоцветное изображение без сжатия.

Изображение по-прежнему построено в квадратной матрице 8х8, но теперь оно уже не одноцветное (или двухцветное, если считать цвет фона) - каждый пиксель может принимать значения из определённого набора цветов. Одного бита на пиксель теперь, разумеется, недостаточно. Будем, как и в Варианте 1, изображать каждый пиксель закрашенным прямоугольником, т.е. символом с кодом 219 = 0DBh; пусть они могут быть одного из четырёх цветов - белый (атрибут = 15), красный (атрибут = 12), зелёный (атрибут = 10) и синий (атрибут = 9).

Каждые четыре идущих подряд пикселя кодируются одним байтом, который будем рассматривать как структуру, состоящую из четырёх двухбитовых полей. Каждое такое поле позволяет представить, очевидно, 22 = 4 различных цвета. Вся строка из восьми пикселей кодируется двумя байтами (или, если угодно, одним машинным словом).

Пример одной строки:

= 0001 0011 0100 0011 = 13h 43h

00 01 00 11 01 00 00 11

Придумать самостоятельно какое-либо изображение и закодировать его описанным образом (получится массив из 16 байт). Разработать алгоритм и программу для вывода изображения на экран виртуального дисплея системы AsmEd.

Вариант 3. Многоцветное изображение со сжатием.

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


11 11 11 11 00 00 00 00

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

Ц В Е Т k -1 Ц В Е Т k - 1

7 6 5 4 3 2 1 0

Для предыдущего рисунка получится байт 11 11 00 11 = F3h.

Придумать самостоятельно какое-либо изображение и закодировать его описанным образом. Разработать алгоритм и программу для вывода изображения на экран виртуального дисплея системы AsmEd.

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