Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx56 / kursach.docx
Скачиваний:
21
Добавлен:
01.08.2013
Размер:
87.59 Кб
Скачать

8 Описание программы

8. 1 Программа выбора варианта №5, формирования и записи слов (Приложение а)

Первая строка является обязательной для кода программы. Во 2 строке вызывается процедура открытия файла с данными в виде дампов памяти UK64.dat. Эта процедура описана в 21-27 строках. В 22 мы в регистр ah помещаем номер функции открытия файла 3dh. 23 - в al заносится значение 0, что говорит о том, что файл открывается только для чтения. 24 - в dx заносится адрес местонахождения этого файла, который записан в формате ASCIIZ (ноль в конце строки) в строке 174. 25 - прерывание DOS. после выполнения процедуры в регистр ax сохраняется дескриптор этого файла, который в строке 26 сохраняется в переменной размером в слово, описанной в строке 181. 27- производится возвращение в главную процедуру программы. В основной программе вызывается функция создания нового файла My.dat , программа передает действие строкам 28-24, строка 29 - вызывает функцию DOS 3ch, это значение заносится в регистр ah. После в строке 30 обнуляется сx , так как отсутствуют атрибуты файла, затем так же как и в процедуре открытия файла в dx передаем адрес расположения файла My.dat , описанный в строке 175, строка 32 – прерывание DOS, 33 - сохранение дескриптора в переменной размером в слово, описанной в строке 182, 34 – возращение из процедуры. Далее в основной программе в строке 4 в регистр cx заносится мой номер варианта 5 для выполнения последующего цикла 5 раз. Строка 5 – метка для выполнения цикла. В строке 6 в стек заносится значение cx, равное 5 , для сохранения его значения и отсутствия переопределения его значения в процедурах, вызываемых позже, таких как в строке 7 – вызов процедуры поиска нулевой строки (строки 35-44). Строка 36 содержит метку для выполнения цикла. Строка 37 – вызов процедуры чтения данных из файла UK64.dat, которая описана в строках 45-51. Строка 46 – в ah заносится номер функции 3fh. 47 – в bx заносится сохранённый дескриптор файла UK64. 48 – в dx помещаем адрес буфера для чтения данных, который описывается в строке 178. 49 - в cx помещаем кол-во считываемых байт (16). Далее строка 51 – возвращение в процедуру поиска нулевой строки. 39,40 – в регистр SI помещается строка, считанная с файла Uk64.dat, а в DI заносится нулевая цепочка байт, описанная в строчке 180. В строке 41 сравниваются цепочки байт побайтово. Если они не совпадают, то цикл проходит заново, возвращаясь на строку 36. Строка 44 – возвращение в главную процедуру. Строка 8 – извлечение значения счётчика из стека. 9 – уменьшение cx на 1. Цикл выполняется до тех пор, пока счётчик не обнулится, иначе выполняется ещё раз. Далее строка 12 –вызов процедуры записи считанного дампа в файл My.dat.(52-68). Строки 54-59 аналогичны 37-42. Далее если строки равны, то выход из цикла. Если нет, то следует функция записи. 61 – помещается в ah 40h. А далее действия аналогичны процедуре чтения. Далее закрываем файл UK64 – строка 13. Процедура закрытия файла описана в 69-73. 70 – в ah помещаем 3eh, 71 - в bx заносится сохранённый дескриптор файла UK64. После возврата из процедуры создаётся файл Result.dat (74-80) идентично созданию My.dat. 15 строка – вызов процедуры по выборке байтов и битов и формированию слов (строки 126-163). На входе в процедуру в строке 127 производится вызов ещё одной процедуры установки указателя файла My.dat (81-88). 81 – в ah помещаем номер функции 42h. 83 – обнуляем al, для установки указателя на начало файла. 85 – в dx помещаем 3, т.к. нам необходимо передвинуть указатель на 3 байт (19-16=3). 86 – в bx заносится сохранённый ранее дескриптор файла My.dat. Далее выходим из этой процедуры. Строка 128 – обнуление регистра di. Затем в регистр cx помещаем 640, т.к. наш цикл должен повториться 640 раз. 130 – метка начала цикла. 131 – помещение cx в стек. 132 – вызов процедуры чтения из файла My.dat (89-95). Эта процедура была описана ранее. Строка 133 – логический сдвиг вправо на 2 (т.к. нам нужен 1 бит из 3 байта). Далее, если флаг CF установлен в 1(134), то мы переходим на следующую метку, в которой производится установка word1 по адресу di(139), затем мы увеличиваем di. Если же сброшен, то и бит сбрасывается соответственно (135), и идёт переход на другую метку (141). И алгоритм повторяется. 142 – вызов процедуры установки указателя (96-103). Только теперь указатель устанавливаем в текущую позицию, для этого в al заносим 1. И сдвигаем на 2 – в dx помещаем 2, чтобы указатель установился на 6 байт (22-16=6). Возвращаемся в процедуру выборки байтов и битов. 143 – вызов процедуры чтения из файла My.dat (104-110). Далее 144 строка: снова логический сдвиг вправо на 5 (т.к. нам нужен 4 бит из 6 байта). Строки 145-151 аналогичны 134-140. Затем мы переходим на метку, в которой di сравнивается с 16 (153). Если не равен (154), то переходит на метку, в которой снова вызывается процедура установки указателя (158). Она описана в строках 118-125. В ней мы с текущей позиции передвигаем указатель на 18, чтобы установить его на 7 байт следующей строки (123). И выполняется цикл до тех пор пока сx не станет равен 0 (161). В этом случае мы выходим из процедуры в основную программу (163). Если же di равно 16, то результирующее слово записывается в канальный файл Result.dat. Для этого вызывается процедура записи (155), которая описана в строках 111-117. После возвращения в основную программу закрываются файлы My.dat и Result.dat (16,17). Затем в строке 18 в регистр ah заносится значение - 10h , и выполняется одноименная функция 16-го прерывания, которая позволяет при запуске программы ожидать нажатие любой клавиши, а строка 20 завершает работу всей программы из-за вызова в этой строке прерывания 20h.

Соседние файлы в папке docx56