В архитектуре ARM 32-битные инструкции (или 16-битные для большинства инструкций состояния Thumb) позволяют 32-битным кодировать как тип команды, так и любые операнды, используемые этой командой.
Из этих 32 битов 4 используются для условного выполнения, оставляя 28. Из оставшихся 28 битов 4 используются для разбиения команд на группы.Это оставляет 24 бита, которые выделяются либо на дополнительное подразделение поведения команды, выбор регистра или непосредственные значения (программные данные, которые кодируются непосредственно в код операции инструкции.)
, поскольку этим битам уже выделено 8 битпервые 2 функции, наибольшее непосредственное значение, которое возможно в 32-битной архитектуре, составляет 24 бита.Как описано в других ответах, команда относительного перехода определяет это 24-битное поле как используемое в качестве смещения со знаком от текущего местоположения.В наборе команд с 16/32-битным большим пальцем смещение, которое доступно в аналогичной инструкции, немного меньше, но все же верно, что большая доля всех ветвей в любой программе, как правило, мала (поэтому это редконеобходимо рассчитывать на регистр ядра для вычисления / хранения адреса ветви).
В 64-битной архитектуре есть аналогичное расхождение.Хотя инструкции по-прежнему только 32-битные, адреса команд теперь больше, чем 32-битные, поэтому потенциально могут быть большие ветви смещенияНа практике это все еще не так часто встречается в одной программе (но может вступить в игру, когда операционная система переключает контекст между одной программой и другой - в этом случае конкретные адреса будут уже сохранены в памяти данных, а не какчасть инструкции).