Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.574Рис. В.7. Содержимое окна трассера для программы уесргосКв при достижении строки 28, но до начала цикла Теперь рассмотрим цикл, начинающийся в строке 28. Команда L0DS через регистр SI загружает слово памяти из сегмента данных в АХ. Так как флаг направления установлен, команда L0DS выполняется в автоинкрементном режиме, а значит, после ее завершения регистр SI указывает на следующий элемент vecl. Чтобы представить этот механизм графически, запустите команду трассера t88 vecprod При появлении окна трассера введите следующую команду: /vecmul+7b Затем нажмите клавишу возврата каретки, установив тем самым контрольную точку в строке, содержащей команду L0DS. (Далее по тексту мы не будем напоминать о том, что после всех команд необходимо нажимать клавишу возврата каретки.) Введите команду g В результате выполнения этой команды трассер будет выполнять команды до контрольной точки. В данном случае он остановится в строке, содержащей команду L0DS. В строке 29 значение АХ умножается на исходный операнд. Слово в памяти, связанное с командой MUL, выбирается из сегмента данных с помощью регистра DI методом косвенной регистровой адресации. Неявным (не указанным в команде) целевым адресом команды MUL является комбинация регистров DX : АХ. В строке 30 результат прибавляется к локальной переменной, расположенной в стеке по адресу -2(ВР). Так как команда MUL не выполняет автоматическое приращение своего операнда, это действие явно выполняется в строке 31. После этого регистр DI указывает на следующий элемент vec2. Текущий этап работы программы завершается командой LOOP. Относительно значения регистра СХ выполняется отрицательное приращение, и если после этого оно остается положительным, программа переходит к локальной метке 1 в строке 28. Локальная метка 1Ь означает поиск ближайшей метки 1 в обратном направлении от текущей позиции. После завершения цикла подпрограмма выталкивает возвращаемое значение из стека в регистр АХ (строка 33), восстанавливает значение ВР (строка 34) и возвращается к вызывающей программе (строка 35). После вызова выполнение основной программы возобновляется с помощью команды M0V (переход к строке 12). Эта команда открывает последовательность из пяти команд, направленную на вывод результата. Системный вызов printf построен по модели функции printf стандартной библиотеки программирования языка С. В строках 13-15 в стек помещаются 3 аргумента: целочисленное значение, которое предполагается вывести, адрес форматной строки (pfmt) и код функции printf (127). Форматная строка pfmt содержит символ #d, указывающий на то, что целочисленная переменная, необходимая для форматирования, является аргументом вызова printf. В строке 17 стек очищается. Так как начало программы находится в строке 5, где указатель стека был сохранен в регистре указателя базы, для очистки стека с тем же успехом можно запустить команду MOV SP,BP Преимущество такого решения состоит в том, что программисту не приходится следить за стеком. Применительно к основной программе это не слишком важно, но при работе с подпрограммами этот подход позволяет избавляться от ненужных данных, таких как устаревшие локальные переменные. |