|
| ||
|
|
||
|
| ||
![]() | ![]() |
Адресация с использованием счетчика команд Любой процессор предоставляет
как минимум один способ такой адресации: адресация самих команд при их последовательной
выборке осуществляется при помощи счетчика команд с постинкрементом. У процессоров
с командами переменной длины величина постинкремента зависит от кода команды.
Литеральная и абсолютная адресация в PDP-11 и VAX
Рис. 2.13. Реализация литеральной адресации через постинкрементную адресацию счетчиком команд Использование счетчика команд в косвенно-регистровом режиме со смещением
позволяет адресовать код и данные относительно адреса текущей команды. Такой режим
адресации называется относительным. Программный модуль, в котором используется
только такая адресация, позиционно независим: его можно перемещать по памяти,
и он даже не заметит факта перемещения, если только не получит управление в процессе
самого перемещения, или не будет специально проверять адреса на совпадение. Впрочем,
почти такого же эффекта можно достичь базовой адресацией. Пример 2.5. Реализация условного перехода с длинным смещением Beq distant_label ; Перейти,
если равно Относительные
переходы в системе команд SPARC
Рис. 2.14. Формат команд условного перехода и вызова процессора SPARC Команда вызова подпрограммы у SPARC также использует адресацию относительно счетчика команд, но адресное поле у нее 30-разрядное и интерпретируется как адрес слова, а не байта. При сложении смещения и счетчика команд возможные переполнения игнорируются, поэтому такой командой можно адресовать любое слово (т. е. любую команду) в 32-разрядном адресном пространстве. На первый взгляд, неясно даже, какая польза от того, что адресация производится относительно счетчика команд, а не абсолютно. Но в 64-разрядных процессорах SPARC v9 польза от этого большая — абсолютный 30-разрядный адрес позволял бы адресовать только первое гигаслово памяти, а относительное смещение адресует именно сегмент кода, в какой бы части 64-разрядного адресного пространства он бы ни находился. Программ, имеющих объем более одной гигакоманды, или даже половины гигакоманды, пока что не написано, поэтому 30-разрядного смещения практически достаточно для адресации в пределах любой современной программы. Процессоры, не предоставляющие программисту прямого доступа к счетчику команд, зачастую все-таки дают возможность записывать в него произвольные значения при помощи специальных команд вычислимого перехода и вычислимого вызова. Команды вычислимого вызова широко используются для реализации указателей на функции из таблиц виртуальных методов в объектно-ориентированных языках. Главное применение команд вычислимого перехода -- реализация операторов switch языка C/C++ или case языка Pascal. |
![]() | ![]() |
| Физика лабы | ||||||||
| ||||||||