Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.578Центральным местом подпрограммы является команда REP M0VSB, расположенная в строке 24 кода. Команда M0VSB перемещает байт, на который указывает регистр SI, по адресу памяти, определяемому регистром DI. После этого содержимое обоих регистров увеличивается на единицу. Команда REP формирует цикл, в котором выполняется команда M0VSB; после перемещения каждого байта она уменьшает значение СХ на 1. Цикл завершается при достижении СХ нулевого значения. Перед выполнением REP M0VSB необходимо подготовить регистры, что и делается в строках 15-22. Индекс источника, SI, копируется из аргумента в стек в строке 21; индекс приемника, DI, определяется в строке 22. Получить значение СХ несколько сложнее. Следует иметь в виду, что конец символьной строки обозначается нулевым байтом. Команда M0VSB не влияет на состояние нулевого флага, в отличие от команды SCASB (просмотр байтовой строки). Последняя сравнивает значение, на которое указывает DI, со значением AL, и выполняет приращение DI «на лету». Подобно M0VSB, она относится к числу повторяющихся команд. В строке 15 очищаются регистры АХ и A L, в строке 16 из стека выбирается указатель на DI, а в строке 17 регистр СХ инициализируется значением -1. В строке 18 находится команда REPNZ SCASB, выполняющая операцию сравнения в контексте цикла и в случае равенства устанавливающая нулевой флаг. При каждом проходе цикла выполняется отрицательное приращение СХ, а при установлении нулевого флага цикл останавливается — команда REPNZ проверяет и нулевой флаг, и СХ. Количество проходов цикла с командой M0VSB, таким образом, определяется как разность текущего значения СХ и предыдущего значения -1 (строки 19-20). Использовать две повторяющиеся команды не слишком изящно, но такова цена проектного решения, основывающегося на принципе независимости кодов условий от команд перемещения. При выполнении циклов проводится приращение индексных регистров, и для этих целей флаг направления должен быть сброшен. В строках 23 и 25 кода скопированная символьная строка выводится при помощи подпрограммы stringpr, имеющейся в папке examples. Она достаточно проста, поэтому обсуждать ее здесь мы не будем. В программе вывода символьных строк в обратном порядке, показанной в листинге В.6, строка 1 кода содержит все стандартные номера системных вызовов. В строке 3 в стек помещается фиктивное значение, а в строке 4 указатель базы (BP) начинает указывать на текущую вершину стека. Эта программа выводит ASCII-символы по одному, а потому в стек вводится численное значение PUTCHAR. Обратите внимание: BP указывает на символ, который предполагается отобразить во время вызова SYS. В строках 2, 6 и 7 регистры DI, AL и СХ подготавливаются к выполнению повторяющейся команды SCASB. Регистр счетчика и целевой индекс загружаются так же, как это происходит в программе копирования строки, за тем лишь исключением, что в регистр AL вместо нуля помещается символ новой строки. Таким образом, команда SCASB сравнивает значения символов строки str с \п, а не с нулем, и в случае соответствия устанавливает нулевой бит. |