Ввод-вывод в си

Работа с устройствами в Linux

Давайте проведем несколько экспериментов, которые помогут вам понять как работают устройства Linux и как ими управлять в этой операционной системе. Большинство дистрибутивов Linux имеют несколько виртуальных консолей, обычно от 1 до 7, которые могут использоваться для входа в сеанс командной оболочки. К этим виртуальным консолям можно получить доступ с помощью сочетаний клавиш Ctrl+Alt+Fn, например, Ctrl+Alt+F1 для первой консоли, Ctrl+Alt+F2 для второй и так далее.

Сейчас нажмите Ctrl+Alt+F2 для перехода во вторую консоль, в некоторых дистрибутивах, кроме запроса логина и пароля, будет выведена информация про активную TTY связанную с этой консолью. Но этой информации может и не быть. В данном случае консоль будет связана с устройством tty2.

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

У меня вы видите устройство /dev/pts/0, это виртуальное устройство эмулятора терминала, но если вы будете выполнять задачу в tty2, то отобразиться именно она. Теперь давайте посмотрим список tty устройств с помощью команды ls:

Нас будут интересовать не все устройства, а только первые три. В этих устройствах нет ничего особенного, это обычные устройства символьного типа. Устройство tty2 подключено к консоли 2, устройство tty3 подключено к консоли 3.

Нажмите сочетание клавиш Ctrl+Alt+F3, чтобы переключиться в третью консоль, затем выполните команду:

Затем вернитесь во вторую консоль. Здесь вы увидите отправленную строку, Hello World. Все это можно повторить с помощью эмуляторов терминала в графическом интерфейсе, только здесь будут использоваться псевдо-терминальные устройства /dev/pts/*. Теперь попробуем отобразить содержимое файла fstab с помощью cat в другом терминале:

С помощью cat вы можете отправить файл непосредственно на принтер. Например, если устройство принтера /dev/usb/lp0, то для печати файла будет достаточно выполнить:

Каталог /dev/ содержит много интересных файлов устройств. Это интерфейсы доступа к аппаратному обеспечению и вам не нужно думать, что это, жесткий диск или экран. Например, вся оперативная память компьютера доступна в виде устройства /dev/mem. С помощью него вы можете иметь прямой доступ к памяти. Мы можем вывести содержимое памяти в терминал:

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

Также тут есть файлы, которые несвязанны ни с какими реальными устройствами, это null, zero, random и urandom. Устройство /dev/null может использоваться для перенаправления вывода команд, чтобы данные никуда не выводились. Устройство /dev/zero используется для получения строки, заполненной нулями.

Вы можете использовать ту же команду dd, чтобы попытаться вывести ряд символов с устройства /dev/null:

Обратите внимание, что ничего выведено не будет, потому что это устройство пусто, оно только принимает данные и никуда их не сохраняет. Устройства /dev/random и /dev/urandom позволяют получить случайные комбинации чисел или байт

Вы можете использовать такую команду, чтобы получить случайные байты информации:

Устройства /dev/random и /dev/urandom позволяют получить случайные комбинации чисел или байт. Вы можете использовать такую команду, чтобы получить случайные байты информации:

Для остановки нажмите Ctrl+C. Устройство urandom позволяет генерировать случайные последовательности независимые от предыдущего числа, в качестве источника энтропии используется нажатия клавиш и движения мыши.

Устройство /dev/zero позволяет получить строку, заполненную нулями. Для проверки используйте такую команду:

Обратите внимание, что восьмеричные нули и нули ASCII это не одно и то же

Изменить букву диска

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

  1. Прежде всего, откройте меню «Пуск» и найдите «Управление дисками». Открой это.
  2. В открывшемся окне «Управление дисками» щелкните том диска правой кнопкой мыши и выберите параметр «Изменить букву диска и путь».Открытие окна изменения буквы диска и путей
  3. В появившемся окне нажмите кнопку «Изменить».Изменение буквы диска
  4. В раскрывающемся меню выберите неиспользуемую букву диска и нажмите OK.Назначение диску новой буквы
  5. Сделав это, снова щелкните том правой кнопкой мыши и выберите параметр «Пометить раздел как активный».
  6. После этого перезагрузите компьютер.
  7. После того, как ваш компьютер загрузится, откройте диск через проводник Windows, чтобы проверить, сохраняется ли сообщение об ошибке.

Файлы устройств Linux

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

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

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

На схеме приведена схема передачи данных для команды cat /etc/resolv.conf. Вы выполняете команду из терминала, утилита отправляет запрос файла драйверу, который ищет файл на диске и читает его содержимое. Данные передаются через файл устройства, а затем опять же, через файл устройства псевдо-терминала передаются в эмулятор терминала 6, где они будут отображены.

Если мы перенаправим вывод команды в файл, например, cat /etc/resolv.conf > /etc/resolv.bak, то левая часть схемы останется неизменной, а правая сторона будет вести к файлу устройства /dev/sda2. Эти устройства делают очень простым использование стандартных потоков ввода/вывода для доступа к каждому устройству. Простое перенаправление потока данных в файл устройства приведет к записи данных на устройство.

I. Горы

Имя входного файла: стандартный ввод

Имя выходного файла: стандартный вывод

Ограничение по времени: 2 секунды

Ограничение по памяти: 256 мегабайт

В парке развлечений «Ай-ой-ай» открылся новейший аттракцион: польские горки. Трек состоит
изnрельс, присоединенных одна к концу другой. Начало первой рельсы находится на высоте 0.
Оператор Петя может конфигурировать аттракцион, изменяя по своему желанию подъём несколь-
ких последовательных рельс. При этом подъём всех остальных рельс не изменяется. При каждом
изменении конфигурации рельс положение следующих за изменяемыми подбирается таким образом,
чтобы весь трек оставался связным.
Каждый запуск вагонетки осуществляется с энергией, достаточной для достижения высотыh.
Это значит, что вагонетка будет двигаться до тех пор, пока высота не превысит h, либо пока не
закончится трек.
По записям о всех изменениях конфигурации рельс и временах запусков вагонетки для каждого
запуска определите, сколько рельс вагонетка проедет до остановки.
Трек можно представить как последовательность n подъемов di, по одному на рельс. Изначально
рельсы горизонтальны, то есть di = 0 для всех i.

Каждое изменение конфигурации определяется числами a,b и D: все рельсы с a-й по b-ю вклю-
чительно после этого действия имеют подъем, равный D.

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

Формат входных данных

В первой строке записано целое числоn( 1 ⩽ n ⩽ 10^9 ) — число рельс. Следующие строки
содержат запросы трех видов:

  • I a b D — изменение конфигурации. Рельсы с a-й по b-ю включительно после выполнения
    запроса имеют подъем, равный D.

  • Q h — запуск вагонетки. Требуется найти число рельс, которое проедет вагонетка, которая
    способна подняться на высоту h.

  • E — конец ввода. Этот запрос встретится ровно один раз в конце файла.

В любой момент времени высота любой точки трека лежит в промежутке от 0 до 10^9. Во вводе
не более 100 000 строк.

стандартный ввод

4
Q 1
I 1 4 2
Q 3
Q 1
I 2 2 -
Q 3
E

стандартный вывод

4
1

3

[править] Программы фильтры

В UNIX/Linux существует целый класс команд, которые
принимают данные со стандартного потока ввода,
каким-то образом обрабатывают их,
и выдают результат на стандартный поток вывода.
Такие программы называются программами-фильтрами.

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

cat
Считывает данные со стандартного потока ввода и передаёт их на стандартный поток вывода. Без опций работает как простой повторитель. С опциями может фильтровать пустые строки, нумеровать строки и делать другую подобную работу.
head
Показывает первые 10 строк (или другое заданное количество), считанных со стандартного потока ввода.
tail
Показывает последние 10 строк (или другое заданное количество), считанные со стандартного потока ввода. Важный частный случай tail -f, который в режиме слежения показывает концовку файла. Это используется, в частности, для просмотра файлов журнальных сообщений.
cut
Вырезает столбец (по символам или полям) из потока ввода и передаёт на поток вывода. В качестве разделителей полей могут использоваться любые символы.
sort
Отсортировать данные в соответствии с какими-либо критериями, например, арифметически по второму столбцу.
uniq
Удалить повторяющиеся строки. Или (с ключом -с) не просто удалить, а написать сколько таких строк было. Учитываются только подряд идущие одинаковые строки, поэтому часто данные сортируются перед тем как отправить их на вход программе.
tee
Ответвить данные в файл. Используется для сохранения промежуточных данных, передающихся в потоке, в файл.
bc
Вычислить каждую отдельную строку потока и записать вместо неё результат вычисления.
hexdump
Показать шестнадцатеричное представление данных, поступающих на стандартный поток ввода.
strings
вычленить и показать в стандартном потоке (или файле) то, что напоминает строки. Всё что не похоже на строковые последовательности, игнорировать. Полезна в сочетании с grep для поиска интересующих строковых последовательностей в бинарных файлах.
grep
Отфильтровать поток, и показать только строки, содержащие (или не содержащие) заданное регулярное выражение.
tr
Посимвольная замена текста в потоке. Например, tr A-Z a-z меняет регистр символов с большого на маленький.
sed
Обработать текст в соответствии с заданным скриптом. Наиболее часто используется для замены текста в потоке: sed s/было/стало/g
awk
Обработать текст в соответствии с заданным скриптом. Как правило, используется для обработки текстовых таблиц, например таких как вывод ps aux и тому подобных, но не только.
perl
Обработать текст в соответствии с заданным скриптом. Возможности языка Perl выходят далеко за рамки однострочников для командной строки, но с однострочниками он справляется особенно виртуозно. В Perl существует оператор <> (diamond operator) и конструкция while(<>) { … }, которая предполагает обработку данных со стандартного потока ввода (или из файлов, если они переданы в качестве аргументов). При написании однострочников можно использовать ключи -n (равносильный оборачиванию кода в while(<>) { … }) или -p (равносильный while(<>) { … }).
sh -s
Текст, который передаётся на стандартный поток ввода sh -s может интерпретироваться как последовательность команд shell. На выход передаётся результат их исполнения.
ssh
Средство удалённого доступа ssh, может работать как фильтр. ssh подхватывает данные, переданные ему на стандартный поток ввода, передаёт их на удалённых хост и подаёт на вход процессу программы, имя которой было передано ему в качестве аргумента. Результат выполнения программы (то есть то, что она выдала на стандартный поток вывода) передаётся со стандартного вывода ssh.

Классификация файлов устройств

Файлы устройств можно классифицировать по меньшей мере двумя способами. Первая и наиболее широкая классификация — на основе потока данных. В устройствах TTY и других символьных устройствах, данные обрабатываются по одному символу или байту за раз. В блочных устройствах, таких как жесткие диски данные передаются блоками, как правило, с размером, кратным 256 байт.

Если вы еще этого не делали, то перейдите в папку /dev/ и посмотрите список находящихся там файлов с помощью команды ls. Вы увидите очень длинный список файлов с их правами доступа, владельцами и группами — это список устройств linux

Обратите внимание на самый первый символ в каждой строке. Он указывает тип устройства.  Символом «b» — обозначаются блочные устройства linux (block), а символом «c» — символьные (character)

Более точно можно идентифицировать устройства по их младшему и старшему номеру. Например, жесткие диски имеют старший номер 8, что обозначает их как блочные устройства SCSI

Обратите внимание, что все жесткие диски PATA и SATA находятся под управлением SCSI.  Раньше использовалась подсистема ATA, но она уже устарела, поэтому диски, которые раньше обозначались как hd теперь обозначаются sd

Основные действия с комплексными числами

Основными операциями, определёнными для комплексных чисел, являются сложение, разность, произведение и деление комплексных чисел. Операции для двух произвольных комплексных чисел (a + bi) и (c + di) определяются следующим образом:

  • сложение: (a + bi) + (c + di) = (a + c) + (b + d)i
  • вычитание: (a + bi) — (c + di) = (a — c) + (b — d)i
  • умножение: (a + bi) · (c + di) = ac + bci + adi + bdi2 = (ac — bd) + (bc + ad)i
  • деление:
    a + bi
    c + di
    =
    (a + bi)(c — di)
    c2 + d2
    =
    (ac + bd)
    c2 + d2
    +
    (bc — ad)
    c2 + d2
    i

Примеры

Найти сумму чисел и :
Найдём отдельно суммы действительных частей и сумму мнимых частей: re = 5 + 5.5 = 10.5, im = 7 — 2 = 5.
Запишем их рядом, добавив к мнимой части i: 10.5 + 5i
Полученное число и будет ответом: + =

Найти разность чисел и :
Найдём отдельно разности действительных частей и разности мнимых частей: re = 12 — 0 = 12, im = -1 — (-2) = 1.
Запишем их рядом, добавив к мнимой части i: 12 + 1i
Полученное число и будет ответом: — =

Найти произведение чисел и :
Найдём по формуле действительную и мнимую части: re = 2·5 — 3·(-7) = 31, im = 3·5 + 2·(-7) = 1.
Запишем их рядом, добавив к мнимой части i: 31 + 1i
Полученное число и будет ответом: * =

Найти отношение чисел и :
Найдём по формуле действительную и мнимую части: re = (75·3 — 50·4) / 25 = 1, im = (-50·3 — 75·4) / 25 = -18.
Запишем их рядом, добавив к мнимой части i: 1 — 18i
Полученное число и будет ответом: / =

I. Групповой турнир

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

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

Местный хоккейный турнир проходит по круговой системе: в турнире участвуют N команд и каждая команда играет с каждой ровно одно игру. За игру команды получают очки по следующим правилам:

Если победителя удалось выявить в основное время матча, то ему достаётся 3 очка, а проигравшему — 0.
Если основное время закончилось вничью и для выявления победителя понадобилось дополнительное время (овертайм), то победителю дают 2 очка, а проигравшему — 1 очко. Овертайм не ограничен во времени и длится до тех пор, пока одна из команд не забьёт гол.
По итогам турнира очки команды определяются как сумма её очков по всем сыгранным играм.

Входные данные

В первой строке входного файла содержится целое число N — количество участников турнира (2  ≤  N  ≤  100). Команды занумерованы числами от 1 до N.

Следующие N строк файла содержат по N символов и представляют собой турнирную таблицу на данный момент. Символ aij в строке i (1  ≤  i  ≤  N) на позиции j (1  ≤  j  ≤  N) означает результат игры команды номер i с командой номер j и может быть одним из:

‘W’ — означает, что команда i обыграет команду j в основное время матча;
‘w’ — команда i обыграет команду j в овертайме;
‘l’ — команда i проиграет команде j в овертайме;
‘L’ — команда i проиграет команде j в основное время матча;
‘.’ — если результат игры между командами i и j ещё не определён;
‘#’ — если i равно j, означает отсутствие данного матча, т. к. команда не может играть сама с собой.
Гарантируется, что данная таблица корректна. Более формально:

aij = ‘#’ для всех i = j;
если aij = ‘.’, то aji = ‘.’;
aij = ‘W’ тогда и только тогда, когда aji = ‘L’;
aij = ‘w’ тогда и только тогда, когда aji = ‘l’.
Последняя строка входного файла содержит N целых чисел pi — количество очков, которое требуется набрать i-й команде (1  ≤  i  ≤  N).

Выходные данные

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

Гарантируется, что решение существует. Если решений несколько, то можно вывести любое из них.

входные данные

4
#..W
.#w.
.l#.
L..#
8 6 3 1

выходные данные

#wWW
l#wW
Ll#w
LLl#

Примеры разных типов отображения

Давайте продолжим и рассмотрим некоторые примеры. Ниже мы имеем три разных элемента HTML с внешним типом отображения . Первый — это абзац, который имеет обрамление, указанное в CSS. Браузер отображает его как блочный элемент, поэтому абзац начинается с новой строки и расширяется на всю доступную ему ширину.

Второй — это список, который свёрстан с использованием . Это устанавливает flex-расположение для элементов внутри контейнера, однако сам список — блочный элемент и — как и абзац — расширяется на всю ширину контейнера и начинается с новой строки.

Ниже у нас есть абзац блочного типа, внутри которого есть два элемента . Эти элементы по умолчанию имеют тип , однако у одного из них задан класс block, для которого мы установили .

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

У нас также есть элемент , для которого установлено , что создаёт строчный элемент вокруг нескольких flex-объектов.

Наконец, у нас есть два абзаца, для которых установлено . И строчный flex-контейнер, и абзацы располагаются вместе на одной строке, а не начинаются каждый с новой строки, как они отображались бы, будучи блочными элементами.

В примере вы можете заменить на или на для переключения между этими двумя режимами отображения.

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

В оставшейся части урока мы сосредоточимся на внешнем типе отображения.

Форматы виртуальных дисков

raw
в целом представляет собой просто набор данных, записанных в том же формате, как и на обычном блочном устройстве. Файл размера 5G будет занимать это место целиком, независимо от того, содержит он полезные данные или просто пустое пространство. (что не применимо к разреженным файлам — прим.пер)

qcow
Отличается от формата raw тем, что может быть инкрементным, потому он растет постепенно — это удобно для тех файловых систем, которые не поддерживают разреженные файлы, например FAT32. Этот формат также позволяет создавать отдельные инкрементные копии из одного базового диска. Использование такого «шаблона» экономит время и место на диске. Кроме того, он поддерживает AES шифрование и сжатие zlib. Недостатком является то, что, в отличии от raw-дисков, такой файл нельзя смонтировать на машину непосредственно на которой он находится. К счастью есть утилита qemu-nbd, которая может экспортировать этот файл как сетевое блочное устройство и затем подключить его к NBD устройсту.

qcow2
представляет собой обновленную версию формата qcow. Основное отличие заключается в том, что он поддерживает снапшоты. В остальном они принципиально не отличаются. Возможно также встретить qcow2, который внутри определяется как QCOW врсии 3, некогда давно он был включен в формат qcow2. Фактически, это модифицированный qcow2 с параметром lazy_refcounts, который используется для снапшотов. Так как разница всего лишь в одном бите, qemu-img с версии 1.7 имеет опцию «amend», чтобы изменить его. Более ранние версии qemu-img такой возможности не имеют. Если вы хотели изменить версию формата, необходимо было преобразовать виртуальный диск в новый файл, во время преобразования параметром compat устанавливалась версия, для которую нужно было уменьшить вместо «1.1» «0.10». Наличие опции «amend» удобно тем, что нет необходимости перезаписывать данные из-за таких незначительных изменений.

qed
Это инкрементный формат COW виртуального диска, который создает наименьшую нагрузку на хост. Он не поддерживает никакого сжатия и использует две параллельные таблицы для адресации блоков данных (кластеров). К сожалению, ни один разработчик в течение долгого времени не был заинтересован в его развитии, поэтому его использование несет некоторые проблемы, которые будут упомянуты.

vdi
формат виртуального диска, используемый системой виртуализации Oracle Virtualbox.

vmdk
формат виртуальных дисков, используемый продуктами VMware. Это тоже формат который позволяет файлу постепенно расти. Однако он имеет большое преимущество по сравнению с qcow2 и qed форматами, которые тоже могут использоваться с бездисковыми решениями или с сетевыми файловыми системами. Он позволяет вам иметь файл виртуального диска, разделенный на несколько мелких файлы с размерам по 2 ГБ. Это осталось еще с тех времен, когда файловые системы не могли создавать файлы размером более чем 2 ГБ. Преимущество состоит в том, что если такой виртуальный диск реплицируется по сети, то передаются меньшие объемы данных, а синхронизация выполняется намного быстрее (например в случае GlusterFS). В случае бездискового решения он также используется для хранения только небольших файлов с различиями для каждого снапшота

vhdx
формат виртуального диска, используемый системой виртуализации Microsoft Hyper-V

vpc
формат виртуального диска используемый системой виртуализации Microsoft VirtualPC.

Инкре
менти
рован
ие
Шифр
ование
Ком
прес
сия
Преал
локация
Шабл
ониз
ация
Проп
уски
Разделе
ние образа
Внутре
нние снапшо
ты
Проверка согласован
ности
Примечание
raw нет нет нет да нет нет нет нет нет Может быть смонтирован через loop
file да нет нет опцио
нально
нет нет нет нет нет Для Btrfs, следует отключать copy-on-write
qcow да да да нет да да нет нет нет
qcow2 да да да опцио
нально
да да нет да да
qed да нет нет нет да нет нет нет нет
vmdk да нет нет опцио
нально
да да? да нет нет
vdi да нет нет опцио
нально (static)
нет нет нет нет да
vhdx да нет нет опцио
нально (fixed)
нет да нет нет нет
vpc да нет нет опцио
нально (fixed)
нет нет нет нет нет

§37. Устройства вывода

Практическая работа № 13 «Процессор и устройства вывода»

Для выполнения этих работ используется учебный компьютер «ЛамПанель», который можно загрузить со страницы https://kpolyakov.spb.ru/prog/lamp.htm.

Возможности программы «ЛамПанель»

Наконец, мы подошли к самой интересной возможности программы «ЛамПанель» — управлению ламповой панелью. Ламповая панель (цифра 1 на рисунке) – это устройство вывода.

Обмен данными процессора и внешнего устройства происходит через порты – регистры контроллера внешнего устройства. У ламповой панели 8 портов, которые называются P0, P1, P2, P3, P4, P5, P6 и P7. Каждый порт «отвечает» за одну строку лампочек, например, для того, чтобы «зажечь» всю верхнюю строку нужно записать в порт P0 код FFFF16 (все 16 бит – единичные). Для этого можно использовать, например, команды

MOV FFFF, R0

OUT R0, P0

К сожалению, записать число сразу в порт нельзя – сначала нужно записать его в регистр (в данном примере – в R0), а потом – из регистра в порт.

Для того, чтобы изменить второй сверху ряд лампочек, нужно записать новое значение в P1 и т.д.; последний ряд управляется портом P7. Например, для того, чтобы все ряды лампочек горели одинаково, можно записать нужный код сначала в регистр:

MOV AAAA, R0

а затем из этого регистра – во все порты:

OUT R0, P0

OUT R0, P1

OUT R0, P7

Здесь многоточие обозначает аналогичные команды записи содержимого регистра R0 в порты P2…P6. Однако вместо последней серии из 8 команд можно использовать всего одну:

SYSTEM 2

Эта команда вызывает системную процедуру с номером 2, находящуюся в ПЗУ компьютера. Для того, чтобы увидеть все процедуры, которые записаны в ПЗУ, нужно щелкнуть по кнопке или выбрать пункт верхнего меню Программа – Просмотр ПЗУ. После этого появляется окно, в левой части которого перечислены все системные процедуры (с их номерами), а в правой части показывается код выбранной процедуры:

В этом списке есть много полезных процедур, в том числе

0 – очистка экрана (погасить все лампочки);

1 – зажечь все лампочки на панели;

3-4 – прокрутка изображения вниз и вверх;

6-9 – логические операции;

A16-E16 – сдвиги битов;

1216 – вывод числа, записанного в регистр R0, в десятичной системе счисления;.

1316 – вывод числа, записанного в регистр R0, в шестнадцатеричной системе счисления.

Обратите внимание, что номер системной процедуры задается в шестнадцатеричной системе счисления.

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

...          ; здесь будет программа
STOP         
M:           ; метка – начало блока данных
  DATA AAAA  ; код первой строчки 
  DATA 5555
  DATA AAAA
  DATA 5555
  DATA AAAA
  DATA 5555
  DATA AAAA
  DATA 5555  ; код последней строчки

Для того, чтобы вывести этот рисунок на экран, нужно записать его адрес в регистр R0 и вызвать системную процедуру с номером 5:

MOV @M, R0 ; записать адрес метки M в регистр R0

SYSTEM 5 ; вывести на экран рисунок, адрес которого в R0

STOP

M:

DATA AAAA ; код первой строчки

Задание на практическую работу

1. Запишите в таблицу минимальное и максимальное числа, которые можно вывести на ламповую панель, если использовать шестнадцатеричную систему:

2. Составьте программу, после выполнения которой ламповая панель выглядит так:

Программа:

3. Как вы думаете, что выведет приведенная выше (в теоретической части) программа, которая вызывает системную процедуру с номером 5? Проверьте ваш ответ с помощью тренажёра.

Ответ:

4. Закодируйте изображение домика и выведите его на экран.

Программа:

5. Добавьте в предыдущую программу команды, которые сначала шифруют изображение, используя операцию «исключающее ИЛИ» с маской BCA716, а затем – восстанавливают исходное изображение. При изменении маски программа не должна изменяться. Изучите текст системной процедуры, которую вы используете.

Программа:

6. Напишите программу, которая делает «бегущую строку» из рисунка-домика.

Программа:

7. Напишите программу, которая организует «обратный отсчет» от 100 до 0, а затем выводит рисунок с домиком и останавливается.

Программа:

Следующая страница §34. Процессор

Cкачать материалы урока

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: