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