Статус нашего сайта: |
ICQ Information Center |
ICQ SHOP 5-значные 6-значные 7-значные 8-значные 9-значные Rippers List ОПЛАТА СТАТЬИ СЕКРЕТЫ HELP CENTER OWNED LIST РОЗЫСК!New! ICQ РЕЛИЗЫ Протоколы ICQ LOL ;-) Настройка компьютера Аватарки Смайлики СОФТ Mail Checkers Bruteforces ICQTeam Soft 8thWonder Soft Other Progs ICQ Patches Miranda ICQ ФорумАрхив! ВАШ АККАУНТ ICQ LiveJournal
РекламаНаш канал:irc.icqinfo.ru |
Таненбаум Э.- Архитектура компьютера. стр.582В случае успешного копирования имени файла его открытие производится в строках 14-20. Если вызов open завершается с ошибкой, возвращаемое значение становится отрицательным, и для отображения сообщения об ошибке производится переход к метке 9 в строке 28. Если вызов проходит успешно, возвращаемым значением является дескриптор файла, который сохраняется в переменной fildes. Этот дескриптор понадобится при последующем выполнении вызовов read и 1 seek. Далее файл считывается блоками по 512 байт, каждый из которых сохраняется в буфере buf. На самом деле под буфер выделяется на два байта больше необходимого объема (512 байт), но сделано это лишь для того, чтобы показать способ размещения символической константы и целого числа в одном выражении (строка 123). Аналогичным образом, в строке 21 в регистр SI загружается адрес следующего элемента массива linh, в результате на дне массива остается машинное слово с нулевым значением. Регистр ВХ получает адрес файла первого непрочитанного символа файла, а значит, в строке 22 перед первым наполнением буфера он инициализируется нулем. За наполнение буфера отвечает подпрограмма fі 11 buf, размещенная в строках 83-93. После введения в стек аргументов read делается запрос на системный вызов, который помещает число фактически считанных символов в регистр АХ. Это число копируется в СХ, и впоследствии по значению этого регистра можно будет узнать число оставшихся в буфере символов. Положение в файле первого непрочитанного символа хранится в регистре ВХ, и в строке 91 значение СХ прибавляется к значению ВХ. В строке 92 дно буфера помещается в DI; таким образом, осуществляется подготовка к просмотру буфера на предмет следующего символа новой строки. После возврата из fill buf в строке 24 проводится проверка того, были ли какие-либо символы фактически считаны. При отрицательном ответе происходит переход из цикла чтения с буферизацией ко второй части программы в строке 25. После этого начинается просмотр буфера. Символ \п загружается в регистр AL в строке 26, а уже в следующей строке это значение просматривается в цикле REP SCASB и сравнивается с буферизованными символами. Выход из цикла может произойти в двух случаях: когда в регистре СХ оказывается нулевое значение или когда просматриваемый символ оказывается символом новой строки. При установленном нулевом флаге последним просмотренным символом оказывается \п, а положения в файле текущего символа (расположенного после перевода строки) сохраняется в массиве linh. Далее происходит приращение счетчика, а положение в файле определяется по значению ВХ и числу символов, оставшихся в СХ (строки 29-31 кода). В строках 32-34 выполняется сохранение, но так как для команды ST0S целевым адресом является не регистр SI, а регистр DI, перед и после вызова команды ST0S эти регистры меняются местами. В строках 35-37 производится проверка оставшихся в буфере данных, после чего в зависимости от значения СХ выполняется переход. По достижении конца файла в нашем распоряжении оказывается полный список положений в файле начальных элементов строк. Так как массив 1 і nh начинается с нулевого слова, нам известно, что первая строка начинается с адреса О, следующая строка находится в положении linh + 2, и т. д. Размер строки п можно вычислить путем вычитания начального адреса строки п из начального адреса строки n + 1. |