Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.201Некоторые команды имеют сложный формат, допускающий краткую форму записи для часто используемых версий. Из всех механизмов, которые JVM применяет для этого, в IJVM мы включили два. В одном случае мы пропустили краткую форму в пользу более традиционной. В другом случае мы показываем, как префиксная команда WIDE может использоваться для изменения следующей команды. Наконец, существуют команда вызова другой процедуры (INVOKEVIRTUAL) и команда выхода из текущей процедуры и возвращения к процедуре, из которой она была вызвана (IRETURN). Из-за сложности механизма мы немного упростили определение. Ограничение состоит в том, что, в отличие от языка Java, в нашем примере процедура может вызывать только такую процедуру, которая находится внутри нее. Хотя это ограничение противоречит сути языка Java, оно позволяет представить более простой механизм без необходимости размещать процедуру динамически. (Если вы не знакомы с объектно-ориентированным программированием, можете игнорировать это предложение. Мы просто превратили язык Java из объектно-ориентированного в обычный, такой как С или Pascal.) На всех компьютерах, кроме JVM, адрес процедуры, которую нужно вызвать, непосредственно определяется командой CALL, поэтому наш подход скорее правило, чем исключение. Механизм вызова процедуры состоит в следующем. Сначала вызывающая программа помещает в стек указатель на вызываемый объект. На рис. 4.10, а этот указатель обозначен символами OBJREF. Затем вызывающая программа помещает в стек параметры процедуры (в данном примере — это Параметр 1, Параметр 2 и Параметр 3). После этого выполняется команда INV0KEVIRTUAL. Команда INVOKE VIRTUAL включает в себя относительный адрес (disp), указывающий на позицию в наборе констант. В этой позиции находится начальный адрес вызываемой процедуры, которая хранится в области процедур. Первые 4 байта в области процедур содержат специальные данные. Первые 2 байта представляют собой целое 16-разрядное число, указывающее на количество параметров данной процедуры (сами параметры были ранее помещены в стек). В данном случае указатель OBJREF считается параметром — параметром 0. Это 16-разрядное целое число вместе со значением SP дает адрес OBJREF. Отметим, что регистр LV указывает на OBJREF, а не на первый реальный параметр. Выбор того, на что указывает LV, в какой-то степени произволен. Следующие 2 байта в области процедур представляют еще одно 16-разрядное целое число, задающее размер области локальных переменных для вызываемой процедуры. Дело в том, что для данной процедуры предоставляется новый стек, который размещается прямо над фреймом локальных переменных, для этого и нужно это число. Наконец, пятый байт в области процедур содержит код первой операции, которую нужно выполнить. Рис. 4.10. Память до выполнения команды 11М\/ОКЕ\/1РТиА1_ (а); память после выполнения этой команды (б) Посмотрим, что происходит перед вызовом процедуры (см. также рис. 4.10). Два байта без знака, которые следуют за кодом операции, используются для индексирования таблицы констант (первый байт — старший). Команда вычисляет базовый адрес нового фрейма локальных переменных. Для этого из указателя стека вычитается число параметров, а ЬУ устанавливается на ОгЗЩЕР. В ОВ^ЕЕ хранится адрес ячейки, в которой находится старое значение РС. Этот адрес вычисляется следующим образом. К размеру фрейма локальных переменных (параметры + локальные переменные) прибавляется адрес, содержащийся в регистре ЬУ. Сразу над адресом, предназначенным для сохранения старого значения РС, находится адрес, в котором должно быть сохранено старое значение ЬУ. Над этим адресом начинается стек для новой вызванной процедуры. БР указывает на старое значение ЬУ, адрес которого находится сразу под первой пустой ячейкой стека. Помните, что БР всегда указывает на верхнее слово в стеке. Если стек пуст, то БР указывает на адрес, который находится непосредственно под стеком, поскольку стек заполняется снизу вверх. |