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

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


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

В ходе следующей операции умножения возникают трудности. При умножении задействуется только значение АХ, в то время как значение DX игнорируется; таким образом, команда MUL умножает АХ (14 464) на 2 и получает 28 928. То есть новым значением АХ становится 28 928, а регистр DX обнуляется, что численно неверно.

Вызов регистров команд и указателя

Наш следующий пример — уесргоскБ — представляет собой небольшую программу, вычисляющую внутреннее произведение двух векторов: чес1 и чес2. Ее код представлен в листинге В.З.

Листинг В.З. Программа vecprocl.s

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

Первая часть этой программы призвана подготовить вызов функции vecmul; для этого SP сохраняется в BP, а затем адреса vec2 и vecl вводятся в стек, что обеспечивает функции vecmul возможность доступа к ним. Далее, в строке 8 длина вектора в байтах загружается в СХ. После смещения этого результата на 1 бит вправо (в строке 9) значение СХ выражает число слов в векторе, которое помещается в стек в строке 10. Вызов vecmul выполняется в строке И.

Стоит, опять же, отметить, что аргументы подпрограмм помещаются в стек в обратном порядке, и делается это в целях соответствия принятому в языке С порядку вызова. Так, средствами С функцию vecmul можно вызвать следующим образом:

vecmul(count, vecl, vec2)

В ходе выполнения команды CALL адрес возврата помещается в стек. Путем трассировки можно определить, что этот адрес — 0x0011.

Первая команда в подпрограмме — PUSH. Она выполняется для указателя базы (BP) в строке 22. Значение BP сохраняется в связи с тем, что этот регистр понадобится для адресации аргументов и локальных переменных данной подпрограммы. Далее, в строке 23 в регистр BP копируется указатель стека; таким образом, новое значение указателя базы задает прежнее значение указателя стека.

После этого все готово к загрузке аргументов в регистры и резервированию пространства под локальную переменную. В следующих трех строках аргументы по одному извлекаются из стека и размещаются в регистре. Как вы помните, стек оптимизирован для хранения слов, значит, адреса должны быть четными. Адрес возврата следует сразу за прежним указателем базы, а потому обращение к нему производится как к 2(ВР). Следующим идет аргумент count — 4(ВР). Он загружается в регистр СХ в строке 24. В строках 25 и 26 векторы vecl и vec2 загружаются в регистры SI и DI, соответственно. Для сохранения промежуточного результата данной подпрограмме нужна одна локальная переменная с исходным значением 0. В связи с этим в строке 27 в стек вводится значение 0.

Состояние процессора непосредственно перед первым проходом цикла, начинающемся в строке 28, показано на рис. В.7. В узком окне в середине верхней части (справа от регистров) изображена область стека. На его дне находится адрес vec2 (0x0022); далее, в порядке восхождения, следуют адрес vecl (0x0018) и третий аргумент, выражающий число элементов в каждом векторе (0x0005). Затем указывается адрес возврата (0x0011). Цифра 1 слева от этого адреса свидетельствует о том, что он является адресом возврата, отстоящим на один уровень от основной программы. В окне под регистрами также показана цифра 1, но на этот раз она выражает символический адрес. Выше адреса возврата в стеке следуют старое значение BP (0x7fc0) и нуль, помещаемый в стек в строке 27. Стрелка, указывающая на это значение, отражает положение указателя стека (регистра SP). В окне справа от секции стека показан фрагмент текста программы; стрелка здесь указывает на следующую команду в порядке выполнения.


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

.