Способы адресации
Для выполнения преобразований над данными (операндами) микроконтроллер должен «знать»: 1) какое преобразование (операцию) он должен выполнить; 2) какие исходные данные (операнды) участвуют в операции. Вся информация, поступающая в микроконтроллер через устройства ввода, так и программа, которая ее обрабатывает, хранится в разных частях памяти ОЗУ и ПЗУ. Для передачи данных (операндов) в АЛУ для обработки требуется указать место расположения операнда в памяти – его адрес. Поэтому структура любой команды содержит два поля: поле кода операции (КОП) и поле операнда или его адреса (или операндов, если их два) (рис.50).
Рис.50. Структура команды микроконтроллера: а) с двумя операндами; б) с одним операндом
Если содержание поля кода операции строго определено для конкретной команды, то содержание поля операнда может иметь различные представления. Здесь может быть представлен собственно операнд в его числовой форме либо указание места расположения (адрес) операнда в памяти. Он может храниться в одном из регистров, в памяти данных ОЗУ, в памяти программ ПЗУ, а следовательно, иметь различные способы представления (указания адреса). Способом адресации операнда называются его различные формы представления в структуре поля команды [2]. Способ адресации зависит от двух факторов: а) от варианта доступа к данным; б) от полноты представления адреса.
По варианту доступа к данным различают:
1. Непосредственная адресация (Immediate constants) - поле операнда непосредственно содержит данные, с которыми работает команда. Перед полем операнда (в большинстве случаев) ставится префикс #. 2. Прямая адресация (Direct Addressing) - префикса перед операндом нет. В поле операнда содержится адрес ячейки памяти, которая содержит данные. Эта адресация используется для внутренней памяти данных и регистров SFR. 3. Косвенная адресация (Indirect Addressing) - перед операндом ставится префикс @. В поле операнда содержится адрес указателя - ячейки памяти, содержащей адрес ячейки памяти, которая содержит данные. Данный вид адресации может применяться при обращении к внутренней памяти данных (в качестве указателя могут использоваться регистры R0 и R1 выбранного регистрового банка или указатель стека SP), а также внешней памяти данных и памяти программ (в качестве указателя могут использоваться регистры DPTR и PC). 4. Индексная адресация (Indexed Addressing) - представляет собой разновидность косвенной адресации со смещением. Например: команда MOVC A,@A+DPTR, аккумулятор перед выполнением команды содержит смещение относительно адреса, содержащегося в DPTR.
Полнота представления адреса может быть:
1. Полная - в поле операнда находится либо полный элемент данных, либо полный адрес, которые могут иметь формат 1 или 2 байта. 2. Регистровая (неполная) (Register Instruction) - операнд занимает место в байте, содержащем код операции. Он содержит несколько младших бит (1 или 3) полного адреса ячейки памяти, то есть работа осуществляется с усеченным адресным пространством – регистровым банком. Таким образом, усеченный адрес – это номер регистра. В случае прямой адресации используется 3 бита полного адреса, что соответствует размеру регистрового банка 8 регистров (R0-R7). В случае косвенной адресации используется только 1 бит полного адреса, поэтому возможна работа только с регистрами R0 и R1. Можно выбрать один из 4-х регистровых банков программированием битов селектора банка (RS1, RS0) в PSW. Достоинство: повышение быстродействия за счет одновременной выборки из памяти программ кода операции и операнда (ов), поэтому часто регистровый банк называют сверхоперативным запоминающим устройством (СОЗУ). Недостатки: ограниченный объем регистрового банка, уменьшение количества поддерживаемых кодов операции в системе команд (так, команда MOV A, Rx, где x принимает значения от 0 до 7, занимает 8 ячеек в системе команд). 3. Неявная (Register-Specific Instructions) - операнд представляет собой уникальный регистр, операция осуществляется только с ним. В этом случае нет необходимости включать его адрес в программный код. Например, это операции с аккумулятором и DPTR. Таблица16
Таким образом, в зависимости от сочетания варианта представления адреса и полноты его указания существуют способы адресации, представленные в таблице 16: 1. Непосредственная полная адресация - когда в поле операнда представлен непосредственно элемент данных, т.е. число над которым выполняется операция, например: команда записи в аккумулятор непосредственного операнда - MOV A, #d (MOV A, #01H), двухбайтовая команда, в которой второй байт представляет непосредственный операнд #d (число 01H). 2. Прямая полная адресация – в поле операнда указывается адрес расположения операнда в памяти, например команда записи в аккумулятор содержимого ячейки памяти данных с прямым адресом - MOV A, ad (MOV A, 21Н), в которой второй байт представляет прямой адрес ad в памяти данных (адрес 21Н). 3. Прямая регистровая адресация – в поле кода операции (!) указывается трехбитный номер регистра rrr = 000÷1112, где расположен операнд. Поле адреса для данного операнда совмещено вместе с кодом операции в одном байте, например: команда инкремента рабочего регистра - INC Rn (00001 rrr). Таким образом, изменяя номер регистра rrr, мы можем обращаться к любому из восьми рабочих регистров выбранного банка. 4. Косвенная регистровая адресация - в поле кода операции (!) указывается однобитный номер регистра i = 0÷12, в котором предварительно записан адрес расположения операнда в памяти, т.е. регистр выполняет роль указателя на фактический адрес. Поле адреса для данного операнда совмещено вместе с кодом операции в одном байте, например: команда инкремента ячейки памяти данных адрес которой находится в регистре Ri - INC @Ri (0000011 i). Таким образом, изменяя номер регистра i, мы можем использовать регистры R0 и R1 в качестве указателей данных при косвенной адресации. 5. Прямая неявная адресация - код операции команды неявным образом определяет регистр (обычно это аккумулятор А), где находится операнд, например однобайтовая команда инверсии аккумулятора - CPL A. 6. Косвенная неявная адресация - код операции неявным образом определяет регистр (обычно это регистр DPTR, либо сумма (А+ DPTR)), который содержит фактический адрес, например команда относительного косвенного перехода – JMP @A+DPTR. Длина или формат команды зависит от двух факторов: а) от количества операндов, участвующих в операции; б) от полноты представления адреса, т.е. от способа адресации. В соответствии с этим команды микроконтроллера бывают однобайтовые, двухбайтовые и трехбайтовые (рис.51). Рис.51. Форматы команд в зависимости от количества операндов и способа адресации
Трехбайтовая команда может содержать либо два однобайтовых операнда с прямой и непосредственной адресацией (рис.51, а,б), либо один 16-разрядный операнд с непосредственной адресацией (рис.51, в), например: - MOV P1,32H - запись в порт Р1 операнда из ячейки ОЗУ с прямым адресом 32Н (порт Р1 также имеет прямой адрес); - MOV 20Н,#01H - запись в ячейку ОЗУ с адресом 20Н числа 01Н; - MOV DPTR,#107FH - запись в регистр DPTR числа 107FH. Двухбайтовые команды оперируют либо с одним операндом, имеющим прямую адресацию (рис.51 г), либо с двумя операндами, один из которых имеет прямую или непосредственную адресацию, а второй представлен операндом с неявной или регистровой (косвенной регистровой) адресацией (рис.51, д,е,ж), например: - PUSH PSW - запись в стек содержимого регистра PSW; - MOV A,P2 - запись в аккумулятор операнда из порта Р2; - MOV R2,#02H - запись в регистр R2 числа 02Н; - MOV @R1,20H - запись в ячейку ОЗУ, адрес которой находится в регистре R1, значения операнда ОЗУ с адресом 20Н. Однобайтовые команды оперируют либо с двумя операндами, один из которых имеет неявную адресацию, а второй регистровую (косвенную регистровую) (рис.51, з) или косвенную неявную (рис.51, и), либо с одним операндом, имеющим неявную адресацию (рис.51, к), либо могут быть командой без операнда (рис.51, л), например: - ADD A,R3 - сложить операнд в аккумуляторе и операнд в регистре R3; - MOVX A,@DPTR - переместить в аккумулятор содержимое ячейки внешней памяти, адрес которой находится в регистре DPTR; - CRL A - очистить (обнулить) аккумулятор; - RET - возврат из подпрограммы. В рассматриваемой структуре команд с двумя операндами операнд 1 и операнд 2 имеют различные функции. В командах перемещения данных операнд 2 является «источником», а операнд 1 – «приемником» данных, поэтому допускаются любые сочетания способов адресации, кроме тех, когда в качестве операнда 1 назначается непосредственный операнд. В командах преобразования данных (арифметических и логических) операнд 1 является «приемником» результата, а в этом качестве выступает аккумулятор. Поэтому допускаются только те сочетания способов адресации, где приемником является операнд (аккумулятор) с неявной адресацией (для некоторых логических команд возможен операнд с прямой адресацией).
|