В чем разница между режимом короткой адресации и режимом длинной адресации

Просматривая некоторые спецификации архитектуры процессора, я увидел термины, режим короткой адресации и режим длинной адресации.

Может ли кто-нибудь дать мне общее представление о терминах (не обязательно для конкретного процессора!)

/ renjith_g


person Renjith G    schedule 12.07.2010    source источник
comment
Какая архитектура процессора? Подобные вещи зависят от процессора.   -  person    schedule 12.07.2010


Ответы (1)


  • Режим короткой адресации использует относительный адрес, рассчитываемый как (некоторый регистр + некоторая небольшая константа), что обычно позволяет выполнять небольшие / немногие / быстрые инструкции, но может адресовать только небольшой диапазон памяти;
  • В режиме длинной адресации используются абсолютные адреса, для которых обычно требуются большие / много / медленные инструкции, но которые могут получить доступ к любой памяти.

Я приведу в качестве примера код ARM, но это, вероятно, применимо (в общем смысле) ко многим другим процессорам.

Каждая инструкция ARM (без учета Thumb) имеет длину 32 бита, и для этого примера мы представим, что ARM может получить доступ к 32-битному адресному пространству.

Каждую инструкцию необходимо декодировать, по существу, разбивая эти 32 бита на различные поля, и некоторые из этих битов должны использоваться для хранения типа инструкции.

Надеюсь, поэтому должно быть ясно, что вы не можете загрузить произвольный адрес в регистр за одну инструкцию:

MOV Rn, #AABBCCDD

Не сработает - поскольку нам нужно использовать биты для указания инструкции (MOV) и регистра назначения (Rn), у нас не осталось 32 бита для хранения 32-битного адреса.

Итак, если нам нужен адрес чего-то в регистре, у нас есть несколько вариантов:

1. Использовать родственник ПК

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

ADR Rn, .label
...
.label

Что расширяется до:

ADD Rn, PC, (.label - here)

Если .label находится в пределах 4k от текущей инструкции, мы можем прибавлять / вычитать из текущего ПК (счетчик программ), чтобы получить этот адрес. Это относительный адрес.

2. Используйте несколько инструкций

Вы можете создать произвольный адрес с помощью добавлений или или:

MOV Rn, #AA000000
ADD Rn, Rn, #00BB0000
ADD Rn, Rn, #0000CC00
ADD Rn, Rn, #000000DD

(На самом деле вы можете сделать это намного эффективнее, но идею вы поняли).

3. Сохраните абсолютный адрес в известном относительном месте

Если вы знаете, что нужный вам адрес хранится поблизости, вы можете загрузить его из памяти:

ADR Rn, .store
LDR Rn, [Rn]

.store
EQU #AABBCCDD

Теперь другие архитектуры процессоров могут иметь инструкции переменной длины (например, x86), поэтому вы можете выбрать, использовать ли короткий режим относительной адресации (например, относительно ПК или другого регистра) или более длинную (и, вероятно) более медленную инструкцию, которая содержит весь 32-битный адрес.

person stusmith    schedule 12.07.2010
comment
У меня есть идея. Но можете ли вы быть немного конкретнее в отношении двух вышеупомянутых режимов адресации? / renjith_g - person Renjith G; 12.07.2010
comment
@RenjithG примеры очень конкретны. Учитывая, что вы на самом деле не указываете процессор, ответ идеален и не может быть улучшен. Если вы выполняете ASM, вы сможете перенести пример на любой процессор, привлекающий ваше внимание. - person mP.; 18.06.2012