В чем разница между режимом короткой адресации и режимом длинной адресации - PullRequest
3 голосов
/ 12 июля 2010

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

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

/ renjith_g

1 Ответ

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

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

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

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

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

MOV Rn, #AABBCCDD

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

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

1.Используйте ПК-относительный

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

ADR Rn, .label
...
.label

, которая расширяется до:

ADD Rn, PC, (.label - here)

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

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

Вы можете создать произвольный адрес, используя add или ors:

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-битный адрес.

...