Как работает адрес инструкции филиала ARM? - PullRequest
0 голосов
/ 27 декабря 2018

Я знаю, что инструкция ARM имеет размер 32 бита, поэтому в памяти она занимает 4 ячейки памяти (каждая ячейка может хранить 8 бит)

Но я не совсем понимаю, как работает адрес инструкции ветвления

При использовании, например, инструкции ветвления

4 бита используются для операции 4 бита для условия 24 бита для места, куда ветвиться

Почему адрес 4 * 24 бита?- Я думал, что каждый адрес инструкции был 32-битным

что это значит, что 24-битное число является смещением?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Такая команда ветвления может прыгать только на расстояние +/- 2 ^ 25 байт от текущего ПК (26 бит для перехода, включая знаковый бит, минус два подразумеваемых младших бита младшего разряда, составляют 24 бита).

Если вы хотите прыгнуть дальше, вы должны использовать, например,

ldr r0,=DistantLabel
bx r0
0 голосов
/ 30 декабря 2018

В архитектуре ARM 32-битные инструкции (или 16-битные для большинства инструкций состояния Thumb) позволяют 32-битным кодировать как тип команды, так и любые операнды, используемые этой командой.

Из этих 32 битов 4 используются для условного выполнения, оставляя 28. Из оставшихся 28 битов 4 используются для разбиения команд на группы.Это оставляет 24 бита, которые выделяются либо на дополнительное подразделение поведения команды, выбор регистра или непосредственные значения (программные данные, которые кодируются непосредственно в код операции инструкции.)

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

В 64-битной архитектуре есть аналогичное расхождение.Хотя инструкции по-прежнему только 32-битные, адреса команд теперь больше, чем 32-битные, поэтому потенциально могут быть большие ветви смещенияНа практике это все еще не так часто встречается в одной программе (но может вступить в игру, когда операционная система переключает контекст между одной программой и другой - в этом случае конкретные адреса будут уже сохранены в памяти данных, а не какчасть инструкции).

0 голосов
/ 27 декабря 2018

Из руководства ARM7TDMI:

Инструкции ветвления содержат 24-битовое смещение в виде дополнения со знаком 2.Это сдвигается влево на два бита, знак расширяется до 32 бит и добавляется в ПК.Поэтому в инструкции можно указать ветвь размером +/- 32 МБ.

Смещение в этом случае означает, что оно относительно текущего PC.

.Причина, по которой смещение сдвинуто на 2 бита (то есть умножено на 4), заключается в том, что каждая инструкция должна быть выровнена по слову, т. е. инструкции должны быть расположены по адресу, кратному 4. Два младших значащих бита всех таких адресоввсегда ноль.Поскольку вы знаете, что они всегда равны нулю, вы можете сохранить 26-битное смещение в 24 битах, пропустив эти два младших значащих бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...