Адресация с использованием счетчика команд Любой процессор предоставляет как минимум один способ
такой адресации: адресация самих команд при их последовательной выборке
осуществляется при помощи счетчика команд с постинкрементом. У процессоров
с командами переменной длины величина постинкремента зависит от кода команды. Литеральная и абсолютная адресация
в 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. |