Я с уважением не согласен с Дэном, это две инструкции впереди, именно так работает конвейер. Размер инструкции составляет либо 2 байта для большого пальца, либо 4 байта для руки, поэтому две инструкции вперед приводят либо к 4, либо к 8 байтам. Это не произвольные X байтов впереди, это две выборки команд впереди.
Большинство людей просто используют ярлыки и никогда не должны знать, как это работает. Для обработчиков исключений, если вы используете режим большого пальца, вам придется иметь дело с ним, и не все версии ARM ARM ясно представляют это, некоторые версии просто говорят, что регистр возврата содержит адрес + 8, когда они означают адрес + две инструкции (что означает 4 или 8, в зависимости от режима, который обозначен lsbit адреса), со временем ARM ARM улучшается, но в старых есть много ошибок. Большинству людей никогда не нужно знать или беспокоиться об этих двух инструкциях.
Основной ответ на ваши вопросы лежит в ARM ARM (ARM Architectural Reference Manual), в кодировке инструкций. Чтобы иметь инструкции фиксированной длины, то есть все команды режима ARM являются 32-битными, непосредственные значения должны быть весьма ограничены. Таким образом, для многих инструкций, таких как сложение, вы можете сказать только 8 «значащих бит» и несколько бит для сдвига. Таким образом, число 0x1001 не будет работать, в двоичном виде это значение 0b0001000000000001. Первый и последний ненулевые биты (значащие биты) требуют 13 бит памяти. но 0x8000 в вашем примере имеет только 1 значащий бит, так что его можно легко сохранить и сместить несколькими способами в инструкции. Для наборов команд, которые имеют инструкции переменной длины, например x86, вы можете иметь полные немедленные значения, вы можете загрузить или добавить значение 0x12345678, поскольку этот 0x12345678 не кодируется в самом основном коде операции, он следует коду операции в памяти и может иметь различные размеры для удовлетворения потребностей набора инструкций. Есть плюсы и минусы фиксированной и переменной длины, что выходит за рамки этого обсуждения. Дело в том, что ARM ARM включает в себя не только определения битовых полей, но каждая инструкция имеет псевдокод, объясняющий, как используются разные битовые поля, включая такие вещи, как pc на две выборки впереди выполняемой в настоящее время инструкции.
Относительная адресация компьютера - это не то, с чем вы обычно сталкиваетесь с ограниченными немедленными действиями, с которыми вы будете иметь дело все время, полезно знать, какие инструкции имеют какие немедленные значения. С режимом большого пальца становится труднее запомнить, какие операции разрешают, какой размер немедленно.