Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.213Вместо этого микрокоманда widel подвергает логическому сложению адрес 0x100 и код операции, поместив его в регистр MPC. В результате интерпретация WIDE LOAD начинается с адреса 0x115 (а не 0x15), интерпретация WIDE IST0RE — с адреса 0x136 (а не 0x36) и т. д. Таким образом, каждый код операции WIDE начинается с адреса, который в управляющей памяти на 256 (то есть 0x100) слов выше, чем соответствующий код обычной операции. Начальная последовательность микрокоманд для IL0AD и WIDE IL0AD показана на рис. 4.15. Рис. 4.15. Начало последовательности микрокоманд для команд ILOAD и WIDE ILOAD. Адреса приводятся в качестве примера Команда WIDE ILOAD отличается от обычной команды IL0AD только тем, что индекс в ней состоит из двух индексных байтов. Слияние и последующее суммирование этих байтов должно происходить поэтапно, при этом сначала первый индексный байт сдвигается влево на 8 бит и копируется в Н. Поскольку индекс — целое число без знака, здесь используется регистр MBRU (24 старших бита заполняются нулями). Затем прибавляется второй байт индекса (операция сложения идентична слиянию, поскольку младший байт регистра Н в данный момент равен 0), при этом гарантируется, что между байтами не будет переноса. Результат снова сохраняется в регистре Н. С этого момента происходят те же действия, что и в стандартной команде IL0AD. Вместо того чтобы дублировать последние микрокоманды (от iload3 до iload5) команды IL0AD, мы просто совершили переход от wide_iload4 к iload3. Отметим, что во время выполнения этой команды значение PC должно увеличиваться на 1 дважды, чтобы в конце этот регистр указывал на следующий код операции. Комаргда IL0AD увеличивает значение один раз; последовательность команд WIDEIL0AD также увеличивает это значение один раз. Такая же ситуация имеет место при выполнении WIDEISTORE. После первых четырех микрокоманд (от wideistorel до wide_istore4) последовательность действий та же, что и в команде I STORE после первых двух микрокоманд, поэтому мы совершаем переход от wide_istore4 к istore3. Далее мы рассмотрим команду LDCW. Есть два отличия этой команды от ILOAD. Во-первых, она содержит 16-разрядное смещение без знака (как и расширенная версия ILOAD), во-вторых, эта команда индексируется из регистра СРР, а не из LV, поскольку она считывает значение из набора констант, а не из фрейма локальных переменных. (Существует еще и краткая форма этой команды — LDC, но мы не стали включать ее в машину IJVM, поскольку полная форма содержит в себе все варианты краткой формы, хотя при этом занимает 3 байта вместо 2.) Команда IINC — единственная команда, помимо IST0RE, которая может изменять локальную переменную. Она включает в себя два операнда по одному байту, как показано на рис. 4.16. Рис. 4.16. Команда IINC содержит два поля операндов Поле индекса нужно для того, чтобы определить смещение от начала фрейма локальных переменных. Команда считывает эту переменную, увеличивает ее на константу (константа содержится во втором поле) и помещает результат обратно в ту же ячейку памяти. Отметим, что константа является 8-разрядным числом со знаком в промежутке от -128 до +127. Машина JVM поддерживает расширенную версию этой команды, в которой длина каждого операнда составляет 2 байта. |