В чем разница между режимом короткой адресации и режимом длинной адресации
Просматривая некоторые листы архитектуры процессора, я увидел термины, режим короткой адресации и режим длинной адресации.
Кто-нибудь может дать мне общее представление о терминах (не обязательно для конкретного процессора!)
/ renjith_g
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. Используйте несколько инструкций
Вы можете создать произвольный адрес, используя 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-битный адрес.