ЭВМ и вычислительные системы. Однопрограммные системы
Заказать
В процессе выполнения данных лабораторных работ студенты долж-ны получить навык по программированию драйверов для управления ПУ. При этом в качестве ПУ рассматриваются наиболее доступные и распро-страненные устройства - экран и клавиатура.
При выполнении лабораторных работ требуется доступ к MS-DOS, запускаемой в среде операционной системы Windows 95 или 98. А также требуется наличие системных программ: 1) Tasm - транслятор ассемблера; 2) Tlink - редактор связей; 3) Debug - отладчик.
Результаты лабораторных работ оформляются в виде файлов, пере-сылаемых в ТМЦДО на дискете. Все исходные программы (файлы с расши-рением asm) должны быть снабжены программными комментариями. При этом особое внимание следует уделить вводным комментариям, поясняю-щим назначение и интерфейсы программных модулей.
Лабораторная работа №1
ПРОГРАММИРОВАНИЕ ДРАЙВЕРА ЭКРАНА
Задание
Требуется реализовать программно нерезидентный драйвер экрана с видеоадаптером CGA, логическая схема которого приведена на рис.40. Кроме того, требуется разработать прикладную программу, выполняющую вывод на экран ваших фамилии и имени, и, возможно, другой информации (по вашему усмотрению), используя для вывода на экран ваш драйвер. Цвет символов, выводимых на экран, а также цвет фона должны быть вы-браны из таблицы 3 в зависимости от номера вашего варианта.
Таблица 3
К Цвет символов Цвет фона
1 черный зеленый
2 синий коричневый
3 зеленый красный
4 голубой черный
5 красный сиреневый
6 сиреневый зеленый
7 коричневый голубой
8 белый черный
9 серый ярко-красный
10 ярко-синий ярко-зеленый
11 ярко-зеленый ярко-белый
12 ярко-голубой ярко-красный
13 ярко-красный желтый
14 ярко-сиреневый ярко-синий
15 желтый ярко-голубой
16 ярко-белый желтый
17 серый ярко-красный
18 ярко-синий серый
19 ярко-зеленый ярко-синий
20 ярко-голубой желтый
Результат выполнения работы оформляется в виде двух файлов с расширением asm (исходные тексты прикладной программы и драйвера) и одного файла с расширением com (загрузочный модуль прикладной про-граммы и драйвера). Все файлы должны быть помещены в каталог LAB1.
Рекомендуемый план отладки
Рекомендуется выполнять отладку драйвера экрана не целиком, а по-степенно наращивая его функции в соответствии со следующим планом.
Шаг 1. Прикладная программа выполняет вызов процедуры инициа-лизации, за которым следуют ожидание нажатия клавиши и возврат в MS-DOS. Процедура инициализации выполняет только очистку экрана задан-ным цветом фона.
Шаг 2. Отличается от шага 1 только тем, что процедура инициализа-ции выполняет не только очистку экрана, но и первоначальную установку курсора.
Шаг 3. Прикладная программа выполняет вызов процедуры инициа-лизации, за которым следуют ожидание нажатия клавиши. Далее она в цик-ле вызывает процедуру вывода символа, передавая ей каждый раз на вход код следующего символа из символьной строки, заданной в прикладной программе. Данная строка завершается каким-то особым байтом, например, 24h. После завершения вывода прикладная программа ожидает нажатия клавиши и выполняет возврат в MS-DOS.
Шаг 4. Отличается от шага 3 тем, что выводимая на экран символь-ная строка содержит кроме других символов "возврат каретки" и "перевод строки".
Примечание 1. При выполнении отладки обычно требуется уметь остановить выполнение программы в заданной точке. В данной работе при выполнении прикладной программы подобная остановка используется два-жды. Во-первых, после завершения процедуры инициализации, так как тре-буется время на перемещение курсора. Во-вторых, программа приостанав-ливается перед возвратом в MS-DOS. В противном случае сразу же после возвращения управления из прикладной программы в MS-DOS, последняя заменит на экране выходные данные программы своими данными.
Для выполнения остановки программы можно воспользоваться си-стемным вызовом BIOS "ожидание ввода с клавиатуры" - INT 16h (функ-ция 0), поместив в программу строки:
MOV AH, 0 ; Номер функции
INT 16h ; Вызов подпрограммы BIOS
Примечание 2. Обе программы не должны содержать системных вы-зовов MS-DOS и BIOS, выполняющих вывод на экран.
Примечание 3. При отладке подпрограммы, выполняющей работу с курсором, надо помнить, что подпрограммы MS-DOS и BIOS, выполняю-щие вывод на экран, будут игнорировать вашу установку курсора и вернут его в то положение, которое он занимал до начала выполнения вашей про-граммы (соответствующее 2-х байтовое значение хранится в области дан-ных BIOS). Например, если вы пользуетесь отладчиком, то во время рабо-ты курсор перестает "слушаться" вашу программу и не двигается с места.
Примечание 4. Так как драйвер экрана и прикладная программа находятся в разных исходных файлах, то имена программных процедур, выполняющих реализацию логических процедур "Инициализация экрана" и "Вывод символа"должны быть перечислены в операторах PUBLIC и EX-TRN, причем оператор EXTRN с атрибутом NEAR.
Примечание 5. Если программная процедура выполняет запись в ре-гистр DS, то в начале этой процедуры обязательно требуется сохранить, а в конце ее восстановить прежнее содержимое этого регистра. Иначе в вызы-вающей программе будет нарушена адресация данных.
Лабораторная работа №2
ПРОГРАММИРОВАНИЕ ДРАЙВЕРА КЛАВИАТУРЫ
Задание
Требуется разработать программу нерезидентного драйвера клавиа-туры, выполняющего запросы прикладных программ по вводу символов с клавиатуры. Драйвер должен обрабатывать управляющую клавишу <CapsLock>, выполняющую переключение регистров. Перед возвратом в MS-DOS выполняется восстановление системной обработки прерываний от клавиатуры.
Для проверки работоспособности драйвера клавиатуры используется прикладная программа, которая, используя драйвер клавиатуры, выполняет ввод символьной строки с клавиатуры в свой внутренний (прикладной) бу-фер. Получив код символа $ (24h), прикладная программа выводит содер-жимое своего буфера на экран, используя для этого драйвер экрана, полу-ченный в результате первой лабораторной работы.
При правильной работе программы введенная с клавиатуры строка должна отобразиться на экране дважды: один раз при наборе на клавиатуре (эхо символов), а второй раз - как результат вывода на экран содержимого прикладного буфера.
Результат выполнения работы оформляется в виде двух файлов с расширением asm (исходные тексты прикладной программы и драйвера клавиатуры) и одного файла с расширением com (загрузочный модуль, включающий прикладную программу, а также драйверы экрана и клавиату-ры). Все файлы должны быть помещены в каталог LAB2.
Логическая схема ввода с клавиатуры
На рис.41 приведена логическая схема, обеспечивающая посимволь-ный обмен с клавиатурой. В реализации этого обмена участвуют контрол-лер клавиатуры, а также разработанный в предыдущей работе драйвер экрана.
Для того чтобы выполнить ввод с клавиатуры, любая системная или прикладная программа вызывает интерфейсную логическую процедуру драйвера клавиатуры "Ввод символа". Если в буфере драйвера имеется хо-тя бы один символ (N>0), то этот символ в качестве выходного параметра передается в прикладную программу. При отсутствии символа в приклад-ную программу возвращается соответствующее значение признака резуль-тата r. Исходной причиной появления кода символа в буфере драйвера яв-ляется нажатие соответствующей клавиши на клавиатуре. Взаимосвязь между этими двумя событиями обеспечивают контроллер клавиатуры и обработчик прерываний. Как показано на рис.41, логическая структура кон-троллера клавиатуры представляет собой совокупность двух процессов - "Прием" и "Выдача". Процесс "Прием" инициируется при нажатии, а так-же при отпускании любой клавиши и помещает генерируемый клавишей код (SCAN-код) во внутренний 4-позиционный буфер контроллера. В ре-зультате появления кода в буфере SCAN-кодов инициируется процесс "Выдача", находившийся в состоянии "Вход 1". Данный процесс выбирает код из буфера, помещает его в порт 60h и выдает в ЦП сигнал прерывания.
Если прерывание разрешено, инициируется модуль "Обработчик прерываний клавиатуры", который считывает SCAN-код из порта 60h и со-общает контроллеру о завершении этой операции установкой бита 7 в пор-те 61h. Это приводит к инициированию процесса "Выдача", находившегося в состоянии "Вход 2". Данный процесс возвращается в состояние "Вход 1". Далее опять выбирается SCAN-код из буфера, и описанные выше дей-ствия повторяются.
S - код символа
N - счетчик символов
M - цвет символа (0<M<7)
r - признак результата (0 - успешно;
1 - символа пока нет)
Рис.41. Логическая схема ввода с клавиатуры
После установки бита 7 в 61h обработчик прерываний выполняет об-работку принятого SCAN-кода. Обработка кода, вызванного нажатием ал-фавитно-цифровой клавиши, сводится к преобразованию SCAN-кода в код ASCII, размещению полученного кода в буфер драйвера и к выводу эха символа.
Необходимость вывода "эха" обусловлена тем, что клавиатура и экран не связаны между собой на уровне контроллеров. Для того чтобы видеть на экране вводимый символ, необходимо выполнить связывание на уровне драйверов. Как видно из рис.41, для этого достаточно, чтобы при нажатии отображаемого символа обработчик прерываний клавиатуры вы-звал логическую процедуру "Вывод символа".
Логическая процедура "Инициализация" имеет единственный вход-ной параметр u: u=0 - выполнить замену системного обработчика прерыва-ний клавиатуры на свой обработчик; u=1 - выполнить замену своего обра-ботчика прерываний клавиатуры на системный обработчик.
SCAN - коды
SCAN-код - однобайтовое число, младшие 7 бит которого представ-ляют идентификационный код клавиши. Старший бит кода (бит 7) указыва-ет на то, была ли клавиша нажата (0) или освобождена (1). Например, 7-битный SCAN-код клавиши "v" есть 47 (или 0101111b). Когда эту клавишу нажимают, в порт 60h контроллер записывает код 00101111b, а когда от-пускают - 10101111b.
Значения SCAN-кодов приведены в таблице 4. В этой таблице приве-дены SCAN-коды только тех клавиш, которым соответствуют отображае-мые на экране символы. Что касается управляющих клавиш, то приведен код только для клавиши <CapsLock>, которая обрабатывается нашим драй-вером.
Таблица 4
SCAN- коды клавиш
Наименование клавиши SCAN-код Наименование клавиши SCAN-код
1 ! 0000010 a A 0011110
2 @ 0000011 s S 0011111
3 # 0000100 d D 0100000
4 $ 0000101 f F 0100001
5 % 0000110 g G 0100010
6 ^ 0000111 h H 0100011
7 & 0001000 j J 0100100
8 * 0001001 k K 0100101
9 ( 0001010 l L 0100110
0 ) 0001011 ; : 0100111
- _ 0001100 ' " 0101000
= + 0001101 \ | 0101011
q Q 0010000 z Z 0101100
w W 0010001 x X 0101101
e E 0010010 c C 0101110
r R 0010011 v V 0101111
t T 0010100 b B 0110000
y Y 0010101 n N 0110001
u U 0010110 m M 0110010
i I 0010111 , < 0110011
o O 0011000 . > 0110100
p P 0011001 / ? 0110101
[ { 0011010 Пробел 0111001
] } 0011011 Caps Lock 0111010
Enter 0011100
Алгоритмы программных модулей
Алгоритмы программных модулей драйвера клавиатуры имеют мно-го общего с алгоритмами программных модулей драйвера считывателя перфоленты (см. п.5.3.3). В частности, буфер драйвера клавиатуры пред-ставляет собой несвязанную циклическую очередь, алгоритмы работы с ко-торой очень похожи на соответствующие алгоритмы драйвера ввода с пер-фоленты. Но между этими драйверами есть и существенные отличия, вы-званные прежде всего техническими деталями управления конкретным устройством (клавиатурой).
Алгоритм программной реализации логической процедуры "Инициализация" состоит из следующих шагов:
Шаг 1. Если u=1 переход на шаг 4 .
Шаг 2. Сохранение в ОП прежнего содержимого вектора прерываний с номером 09h.
Шаг 3. Запись стартового адреса обработчика прерываний клавиату-ры в вектор прерываний с номером 09h. Переход на шаг 5.
Шаг 4. Восстановление прежнего содержимого вектора прерываний с номером 09h.
Шаг 5. Возврат из процедуры.
Алгоритм обработчика прерываний клавиатуры включает шаги:
Шаг 1. Разрешение маскируемых прерываний.
Шаг 2. Сохранение в программном стеке содержимого регистров.
Шаг 3. Запись в сегментный регистр DS значения, которое соответ-ствует адресу-сегменту данных обработчика прерываний.
Шаг 4. Чтение из порта 60h значения SCAN-кода.
Шаг 5. Установка бита 7 порта 61h.
Шаг 6. Сброс бита 7 порта 61h.
Шаг 7. Если была отпущена клавиша <CapsLock>, то инвертирование флага статуса клавиатуры. Переход на шаг 14.
Шаг 8. Если было отпускание клавиши, то переход на шаг 14.
Шаг 9. Если буфер полон, то переход на шаг 14.
Шаг 10. Перекодировка SCAN-кода в символ ASCII.
Шаг 11. Запись символа ASCII в буфер драйвера.
Шаг 12. Вывод "эха" полученного символа на экран.
Шаг 13. Если полученный символ является символом "возврат карет-ки" (этот символ есть результат нажатия <Enter>), то запись в буфер и вы-вод на экран дополнительного символа "перевод строки".
Шаг 14. Выдача в программируемый контроллер прерываний коман-ды для разрешения менее приоритетных прерываний.
Шаг 15. Восстановление содержимого регистров из стека.
Шаг 16. Возврат из прерывания в прерванную программу.
Дополнение к шагам 5 и 6. Порт 61h используется не только клави-атурой (она использует только бит 7), но и другими устройствами. Поэто-му к моменту завершения шага 6 содержимое этого порта должно быть тем же, что было до начала шага 5.
Дополнение к шагам 7 и 10. Большинству клавиш соответствует не один, а два символа. Например, одна и та же клавиша соответствует симво-лам "1" и "!". Каждой большой (прописной) букве соответствует малая (строчная). Для того чтобы обработчик прерываний выполнял правильное преобразование SCAN-кода в код ASCII, необходимо ввести понятие "со-стояние клавиатуры". В одном состоянии в буфер драйвера записывается код ASCII большой буквы, а во втором - малой. Часто состояния клавиа-туры называют "нижним регистром" и "верхним регистром".
Для отслеживания состояния клавиатуры обработчик прерываний должен иметь двоичную переменную "флаг статуса клавиатуры". Для управления этим флагом рекомендуется использовать управляющую кла-вишу <CapsLock>. Нажатие, а затем отпускание <CapsLock> обеспечивает долговременное изменение флага статуса, которое действует до следующе-го нажатия этой же клавиши.
При программировании шага 10 удобно свести значения SCAN-кодов и соответствующих кодов ASCII в единую таблицу. Первая строка этой таблицы может иметь вид:
Tabl DB 02h, '1', '!'
Строка таблицы, соответствующая пробелу:
DB 39h, ' ', ' '
В данной таблице отсутствует строка, соответствующая управляю-щему символу CapsLock. В качестве последнего байта таблицы рекоменду-ется взять нулевой байт.
Шаг11 рекомендуется реализовать в виде программной процедуры.
Алгоритм подпрограммы "Ввод символа" состоит из следующих шагов:
Шаг 1. Сохранение в программном стеке содержимого регистров.
Шаг 2. Если буфер пуст, то возврат в программу с соответствующим значением признака результата.
Шаг 3. Переписка символа из буфера в регистр, используемый для передачи символа из подпрограммы в вызывающую программу.
Шаг 4. Увеличение указателя "взять" и уменьшение счетчика симво-лов.
Шаг 5. Если указатель "взять" вышел за границу буфера, то установ-ка его на начало буфера.
Шаг 6. Восстановление регистров из стека.
Шаг 7. Возврат из подпрограммы с соответствующим значением признака результата.
Рекомендуемый план отладки
Отладку программы драйвера клавиатуры рекомендуется выполнить в два этапа.
Этап 1. Обеспечение вывода на экран содержимого прикладного бу-фера, а также обеспечение вывода на экран "эха" символов, вводимых с клавиатуры. В прикладной буфер с помощью псевдооператора DB записы-вается какая-то символьная строка, заканчивающаяся каким то особым символом, например, с кодом 24h. Прикладная программа сначала вызыва-ет процедуру инициализации экрана, а затем процедуру инициализации клавиатуры с параметром u=0. Затем она выводит посимвольно содержи-мое прикладного буфера на экран с помощью соответствующей процедуры драйвера экрана. При достижении конечного символа (с кодом 24h) при-кладная программа в цикле вызывает процедуру драйвера клавиатуры "Ввод символа" до тех пор, пока от нее не будет получен символ с опреде-ленным кодом, в качестве которого опять можно использовать 24h. После этого прикладная программа вызывает процедуру инициализации клавиату-ры с параметром u=1 и делает возврат в MS-DOS. Обработчик прерываний клавиатуры должен правильно реагировать на нажатие каждой клавиши, помещая (если нужно) ее код в буфер драйвера клавиатуры и выводя эхо символа на экран (с помощью процедуры драйвера экрана).
Этап 2. Окончательная отладка драйвера клавиатуры. Для этого из-меняется прикладная программа, использовавшаяся на шаге 1: после за-вершения инициализации экрана и клавиатуры прикладная программа вы-полняет ввод с клавиатуры (с помощью процедуры "Ввод символа") стро-ки символов в свой прикладной буфер. Ввод в прикладной буфер произво-дится до тех пор, пока прикладная программа не получит символ с кодом 24h. Далее повторяются действия этапа 1: прикладная программа выводит содержимое своего прикладного буфера на экран, а затем в цикле вызывает процедуру "Ввод символа". При получении кода 24h восстанавливается системный обработчик прерываний клавиатуры и делается возврат в MS-DOS.
Примечание. Разработанные программы не должны содержать си-стемных вызовов MS-DOS и BIOS, выполняющих информационный обмен с клавиатурой и экраном.
КОНТРОЛЬНАЯ РАБОТА № 2
РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕ
Целью выполнения данной работы является проверка навыков про-граммирования на ассемблере задач, описание которых приведено в насто-ящем пособии.
Результаты контрольной работы представляются в виде файлов на дискете:
1) файл (файлы) с расширением asm - исходный модуль (модули) разработанной программы (программ);
2) файл (файлы) с расширением com - загрузочный модуль (модули) разработанной программы (программ).
Общие требования к программам:
обязательное наличие комментариев в исходных модулях - заго-ловков к программным модулям и построчных комментариев;
текст каждого исходного модуля должен быть представлен в коде ASCII. (Такой текст может быть получен, например, с помощью текстового редактора, встроенного в Norton commander);
запрещается применение команд для процессоров, отличных от i8086;
обязательное наличие выходных сообщений программы, предва-ряющих ввод пользователя с клавиатуры;
обязательное наличие выходных сообщений в случае ошибок при выполнении системных вызовов.
Разработка некоторых программ предполагает использование для ввода и вывода не системных вызовов MS-DOS и BIOS, а собственных драйверов экрана и клавиатуры, полученных ранее при выполнении лабораторных ра-бот. Наличие такого требования обязательно отмечается в соответствую-щем задании на программирование. В этом случае результаты контрольной работы должны включать, кроме перечисленных выше файлов, загрузоч-ные модули используемых драйверов (копии файлов, представленных в ре-зультатах лабораторных работ).
Кроме того, некоторые программы должны быть резидентными. Это требование также обязательно отмечается в задании.
Варианты контрольной работы №2
Вариант 1. Резидентная программа инициируется нажатием клавиши <F1> и выводит на экран ваши имя и фамилию, записанные английскими буквами. При нажатии клавиши <F2> программа уничтожается.
Примечание. Для вывода на экран следует использовать свой драйвер экрана.
Вариант 2. Резидентная программа инициируется нажатием клавиши <F2> и выводит на экран ваши имя и фамилию, записанные русскими бук-вами. При нажатии клавиши <F1> программа уничтожается.
Примечание. Для вывода на экран следует использовать свой драйвер экрана.
Вариант 3. Разработать простейший отладчик программ, который получает имя загрузочного модуля прикладной программы в качестве свое-го параметра, и выполняет эту программу покомандно, выдавая после за-вершения каждой ее команды на экран содержимое регистров AX и BX в шестнадцатеричной системе счисления. (Некоторый аналог команды T Debug.)
Примечание 1. Работа программы основана на запуске трассируемой программы и обработке исключения "Трассировка" (см. замечание в конце п.2.6.2).
Примечание 2. Для вывода на экран шестнадцатеричного содержимо-го регистров можно использовать программную процедуру, алгоритм ко-торой рассматривается в [2].
Вариант 4. Разработать простейший отладчик программ, который вводит с клавиатуры имя загрузочного модуля прикладной программы, и выполняет эту программу покомандно, выдавая после завершения каждой ее команды на экран содержимое регистров CX и DX в двоичной системе счисления. (Некоторый аналог команды T Debug.)
Примечание 1. Работа программы основана на запуске трассируемой программы и обработке исключения "Трассировка" (см. замечание в конце п.2.6.2).
Примечание 2. Для вывода на экран двоичного содержимого реги-стров можно использовать программную процедуру, алгоритм которой рассматривается в [2].
Вариант 5. Разработать простейший интерпретатор команд, выпол-няющий обработку командных файлов (bat-файлов). Имя командного фай-ла вводится с клавиатуры. Имя запускаемой программы (строка bat-файла) не имеет параметров. После завершения запуска очередной программы на экран выводится сообщение об успешности запуска.
Вариант 6. Разработать простейший интерпретатор команд, выпол-няющий обработку командных файлов (bat-файлов). Имя командного фай-ла интерпретатор команд получает при своем запуске (в качестве параметра команды). Имя запускаемой программы (строка bat-файла) не имеет пара-метров. После завершения запуска очередной программы на экран выво-дится сообщение об успешности запуска.
Вариант 7. Прикладная программа выполняет запуск другой (дочер-ней) прикладной программы, получив предварительно ее имя с клавиатуры. При своем запуске дочерняя программа получает на входе (в PSP) строку символов, которую она выводит на экран.
Примечание. Для вывода на экран дочерняя программа должна ис-пользовать ваш драйвер экрана.
Вариант 8. Прикладная программа выполняет запуск другой (дочер-ней) прикладной программы, получив ее имя в качестве своего параметра (хвоста команды). При своем запуске дочерняя программа получает на входе (в PSP) строку символов, которую она выводит на экран.
Примечание. Для вывода на экран дочерняя программа должна ис-пользовать ваш драйвер экрана.
Вариант 9. Прикладная программа выводит на экран содержимое своего блока окружения.
Примечание. Для вывода на экран программа должна использовать ваш драйвер экрана.
Вариант 10. Прикладная программа выполняет уничтожение файла. Имя уничтожаемого файла вводится с клавиатуры.
Примечание. Для ввода с клавиатуры и для вывода на экран следует использовать ваши драйверы.
Вариант 11. Прикладная программа вводит с клавиатуры имя нового текстового файла, записывает в него содержимое своего блока окружения, а также "хвоста", а затем выводит содержимое этого файла на экран.
Вариант 12. Прикладная программа вводит с клавиатуры имя суще-ствующего текстового файла, "дописывает" в него содержимое своего бло-ка окружения, а также "хвоста", а затем выводит содержимое этого файла на экран.
Вариант 13. Резидентная программа инициируется из прикладной программы, выполняя вывод на экран блока окружения и "хвоста" при-кладной программы.
Примечание. Для того чтобы обрабатывать данные вызывающей про-граммы, содержимое регистров сегментов данных должно соответствовать прикладной, а не резидентной программе.
Вариант 14. Прикладная программа вводит с клавиатуры имена двух существующих текстовых файлов, а затем инициирует резидентную про-грамму (передав ей на вход через PSP имена файлов), которая "расширяет" первый файл, добавив в него содержимое второго файла.
Вариант 15. Прикладная программа вводит с клавиатуры имя суще-ствующего текстового файла, а затем выводит его содержимое на экран.
Примечание. Для вывода на экран следует использовать свой драй-вер экрана.
Вариант 16. Прикладная программа получает в качестве параметра команды имя существующего текстового файла, а затем выводит его со-держимое на экран.
Примечание. Для вывода на экран следует использовать свой драй-вер экрана.
Вариант 17. Прикладная программа вводит с клавиатуры имя тек-стового файла, содержащего имена других текстовых файлов. А затем вы-водит на экран содержимое этих текстовых файлов.
Вариант 18. Прикладная программа получает в качестве параметра команды имя текстового файла, содержащего имена других текстовых фай-лов. А затем выводит на экран содержимое этих текстовых файлов.
Вариант 19. Прикладная программа выполняет копирование файла. Имена исходного файла и файла-копии вводятся с клавиатуры.
Примечание. Для вывода на экран следует использовать свой драйвер экрана.
Вариант 20. Прикладная программа выполняет копирование файла. Имя исходного файла вводится с клавиатуры, а имя файла-копии програм-ма получает в качестве параметра команды.
Примечание. Для вывода на экран следует использовать свой драйвер экрана.
Для удобства наших клиентов, проходящих обучение на ФДО ТУСУРа, была создана данная форма заказа, с помощью которой Вы можете БЕСПЛАТНО УЗНАТЬ СТОИМОСТЬ оказания помощи в выполнении работ по тем дисциплинам, которые Вам необходимы. Если Вы хотите заказать ОПТОМ выполнение одного и более семестров, то мы предложим Вам выполнение работ под ключ по самым выгодным ценам. Пожалуйста свяжитесь с нами по следующим контактам