Статус нашего сайта: |
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В ходе следующей операции умножения возникают трудности. При умножении задействуется только значение АХ, в то время как значение 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). В окне справа от секции стека показан фрагмент текста программы; стрелка здесь указывает на следующую команду в порядке выполнения. |