Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.583В оставшейся части программы считывается номер символьной строки, эта строка передается в буфер, после чего она выводится при помощи вызова write. Все необходимые для выполнения этих операций данные имеются в массиве linh, где каждая n-ная запись содержит начальное положение строки п в файле. Если номер запрошенной символьной строки равен нулю или выходит за пределы допустимого диапазона, программа завершается путем перехода к метке 7. Эта часть программы начинается с вызова подпрограммы getnum (строка 46 кода). Она считывает символьную строку из стандартного ввода и сохраняет в буфере linein (строки 95-103 кода). Далее подготавливается вызов SSCANF. Принимая во внимание обратный порядок следования аргументов, в стек сначала помещается адрес буфера curl in, где можно разместить целочисленное значение, затем адрес форматной строки для целочисленного представления numfmt, и, наконец, адрес буфера linein, в котором содержится число в десятичном представлении. Если это возможно, системная подпрограмма SSCANF помещает двоичное значение в curl in. В случае ошибки она возвращает нулевое значение АХ. Проверка возвращаемого значения проводится в строке 48; при ошибке программа генерирует сообщение об ошибке посредством метки 8. Если подпрограмма getnum возвращает действительное целочисленное значение в curl in, оно сначала копируется в ВХ. Далее это значение проверяется на предмет принадлежности к допустимому диапазону (строки 49-53 кода). Если обнаруживается, что номер строки выходит за пределы этого диапазона, происходит выход (EXIT). Далее необходимо определить конечное положение данной строки в файле и число считываемых файлов; с этой целью значение ВХ умножается на 2 посредством сдвига влево (SHL). В строке 55 положение текущей символьной строки в файле копируется в регистр АХ. Затем положение следующей символьной строки помещается в регистр СХ, и на его основе вычисляется число байтов в текущей строке. Для произвольного чтения данных из файла применяется вызов 1 seek; он устанавливает смещение к байту, который предполагается прочесть в следующую очередь. Подпрограмма 1 seek выполняется относительно начала файла, и в этой связи в строке 57 в стек помещается нулевой аргумент. Следующим аргументом является смещение в файле. По определению этот аргумент является длинным (32-разрядным) целым, поэтому сначала в стек вводится нулевое слово, а затем — значение АХ (строки 58 и 59 кода); таким образом формируется 32-разрядное целочисленное значение. Далее в строке 62 в стек отправляются дескриптор файла и код LSEEK, а также выполняется вызов. Возвращаемое значение LSEEK определяет текущее положение в файле, а найти его можно в комбинации регистров DX : АХ. Если число умещается в рамки машинного слова (а размер файла не превышает 65 536 байт, по-другому быть и не может), адрес помещается в АХ; следовательно, если вычесть значение этого регистра из СХ (строка 63), мы получим число байтов, которые необходимо прочесть для помещения строки в буфер. Все остальное очень просто. В строках 64-68 строка считывается из файла, а затем при помощи дескриптора 1 файла в строках 70-72 она записывается в файл стандартного вывода. Следует иметь в виду, что после частичной очистки стека, которая выполняется в строке 69, значения счетчика и буфера в нем остаются. Наконец, в строке 73, указатель стека сбрасывается полностью, после чего осуществляются обратный переход к метке 3 и очередной вызов getnum. |