Статус
нашего
сайта:
ICQ Secrets Center is Online  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


Таненбаум Э.- Архитектура компьютера. стр.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 с \п, а не с нулем, и в случае соответствия устанавливает нулевой бит.


⇐ Предыдущая страница| |Следующая страница ⇒

.