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

Таненбаум Э.- Архитектура компьютера. стр.574


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

Преимущество такого решения состоит в том, что программисту не приходится следить за стеком. Применительно к основной программе это не слишком важно, но при работе с подпрограммами этот подход позволяет избавляться от ненужных данных, таких как устаревшие локальные переменные.


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

.