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

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


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

И наконец, для выполнения команды INVOKE VIRTUAL нужно сделать так, чтобы регистр PC указывал на пятый байт в кодовом пространстве процедуры.

Команда IRETURN противоположна команде INV0KEVIRTUAL (рис. 4.11). Она освобождает пространство, используемое процедурой. Она также возвращает стек в предыдущее состояние, за исключением того, что, во-первых, OBJREF и все параметры удаляются из стека; во-вторых, возвращенное значение помещается в стек, туда, где раньше находился параметр OBJREF. Чтобы восстановить прежнее состояние, команда IRETURN должна вернуть прежние значения указателей PC и LV. Для этого она обращается к связующему указателю (это слово, определяемое текущим значением LV). В этом месте, где изначально находился параметр OBJREF, команда INV0KEVIRTUAL сохранила адрес, содержащий старое значение PC. Это слово, а также слово над ним извлекаются, чтобы восстановить старые значения PC и LV соответственно. Возвращенное значение, которое хранится на самой вершине стека завершающейся процедуры, копируется туда, где изначально находился параметр OBJREF, после чего SP начинает указывать на этот адрес. И тогда управление переходит к команде, которая следует сразу за INVOKEVIRTUAL.

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

Рис. 4.11. Память до выполнения команды IRETURN (а); память после выполнения

этой команды (б)

До сих пор у нашей машины не было никаких команд ввода-вывода. Мы и не собираемся их вводить. В нашем примере, как и в виртуальной машине Java, они не нужны, и в описании JVM никогда не упоминаются процессы ввода-вывода. Считается, что машина без механизмов ввода-вывода более надежна. (Чтение и запись осуществляются в JVM путем вызова специальных процедур.)

Компиляция IJVM

А теперь посмотрим, какое отношение язык Java имеет к IJVM. В листинге 4.1 представлен небольшой фрагмент программы на языке Java. Компилятор Java должен был бы переделать эту программу в программу на языке ассемблера IJVM, приведенную в листинге 4.2. Цифры с 1 по 15 в левой части листинга, а также комментарии после символов двойной косой черты (//) не являются частью самой программы. Они даны для наглядности и просто облегчают понимание. Затем ассемблер Java транслировал бы ее в программу в двоичном коде. Эта программа представлена в листинге 4.3. (В действительности результатом работы компилятора Java сразу является двоичный код.) В данном примере i — локальная переменная 1, j — локальная переменная 2, а к — локальная переменная 3.

Листинг 4.1. Фрагмент программы на языке Java

i=j+k; if(I==3) k=0;

else

J=M;

Листинг 4.2. Программа для IJVM на языке ассемблера Java

1 ILOAD j // i=j+k

2 I LOAD k

3 I ADD

4 ISTORE i

5 I LOAD i // if(i==3)

6 BIPUSH 3

7 IFJCMPEQ LI

8 I LOAD j //

9 BIPUSH 1

10 ISUB

11 ISTORE j

12 GOTO L2

13 LI: BIPUSH 0 // k=0

14 ISTORE k

15 L2:

Листинг 4.3. Программа для IJVM в шестнадцатеричном коде

0x15 0x02 0x15 0x03 0x60

ОхЗб 0x01 0x15 0x01 0x10 0x03 0x9F 0x00 OxOD 0x15 0x02 0x10 0x01

0x64

0x36 0x02 0хА7 0x00 0x07 0x10 0x00 0x36 0x03

Скомпилированная программа проста. Сначала j и к помещаются в стек, складываются, а результат сохраняется в i. Затем i и константа 3 помещаются в стек и сравниваются. Если они равны, то совершается условный переход к L1, где к получает значение 0. Если они не равны, то выполняется часть программы после команды IF_ICMPEQ. После этого осуществляется переход к L2, где объединяются части el se и then.


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

.