Cпособы адресации и формат команд
Процессор выполняет обработку битов, байтов, 16-разрядных слов, 32-разрядных длинных
слов и двоично-десятичных чисел (1 байт = 2 десятичных разряда). Обрабатываемые данные - операнды могут располагаться в регистрах
(данных или адреса) или оперативной памяти. Для выборки слова (байты B1-0) или длинного слова (байты B3-0) команда задает адрес
старшего байта N, четный или кратный четырем. При этом слова и длинные слова размещаются таким образом, что младшие байты (разряды
D7-0 данных) располагаются в ячейках памяти с большими адресами: N+1 или N=3 (рис.3.3). Такое размещение байтов в памяти от старшего
к младшему соответствует естественному порядку их написания слева - направо. Этот порядок адресации байтов называется в зарубежной
литературе "big -endian". Он отличается от порядка "little-endian", принятого компанией INTEL и рядом других производителей, когда
размещение слова начинается с младшего байта, адрес которого служит адресом слова.
|
Старший байт И1 (разряды D15-8) |
Младший байт В0 (разряды D7-0) |
|
a) |
|
|
|
|
Старший байт В3 (разряды D31-24) |
Байт В2 (разряды D23-16) |
Байт В1 (разряды D15-8) |
Младший байт В0 (разряды D7-0) |
|
б) |
Рис.3.3. Адресация байтов в слове (а) и длинном слове (б)
Процессор CPU32 реализует следующие способы адресации операндов:
- регистровая (операнд в регистре данных или адреса),
- косвенно-регистровая (операнд в ячейке памяти, адресуемой содержимым регистра адреса),
- косвенно-регистровая с постинкрементом (операнд в ячейке памяти, адресуемой содержимым регистра адреса, которое автоматически
увеличивается после выборки операнда для адресации следующей ячейки),
- косвенно-регистровая с предекрементом (операнд в ячейке памяти, адресуемой содержимым регистра адреса, которое автоматически
уменьшается перед выборкой операнда для адресации предыдущей ячейки),
- косвенно-регистровая со смещением (операнд в ячейке памяти, адрес которой является суммой содержимого регистра адреса и
16-разрядного смещения d16, заданного в команде),
- косвенно-регистровая с индексированием (операнд в ячейке памяти, адрес которой является суммой содержимого регистра адреса,
индексного регистра и данного в команде 8-разрядного смещения d8),
- прямая (операнд в ячейке памяти, адрес которой задается числом Abs, указанным в команде),
- относительная (операнд в ячейке памяти, адрес которой является суммой текущего содержимого программного счетчика PC и данного
в команде 16-разрядного смещения d16 или базового смещения bd),
- относительная с индексированием (операнд в ячейке памяти, адрес которой является суммой содержимого программного счетчика PC,
индексного регистра и данного в команде 16-разрядного смещения d16 или 32-разрядного базового смещения bd),
- непосредственная (значение операнда Im дано в команде).
Таблица 3.1. Способы адресации CPU32, их представление
в формате команды и на языке ассемблера
N |
Способ адресации |
MODE |
REG |
Синтаксис ассемблера |
1 2 |
регистры данных регистры адреса |
000 001 |
n n |
Dn An |
|
косвенно-регистровая (КР) |
КР с постинкрементом |
КР с предекрементом |
КР со смещением |
КР с индексированием |
|
|
|
(An) |
(An) + |
- (An) |
(d16,An) |
(d8,An,Xn.sz*scale) |
|
8 9 |
прямая (короткая) прямая (длинная) |
111 111 |
000 001 |
Abs. W Abs. L |
10 11 |
относительная относительная с индексированием |
111 111 |
101 011 |
(d16,PC) (d8,PC,Xn.sz*scale) |
12 |
непосредственная |
111 |
100 |
# Im |
13 |
КР с базовым смещением и индексированием |
110 |
n |
(bd, An, Xn.sz*scale) |
14 |
относительная с базовым смещением и индексированием |
111 |
011 |
(bd, PC, Xn.sz*scale) |
Смещение d16 или d8 может быть как положительным, так и отрицательным. В формате
команды (рис.3.4) это смещение представляется двоичным числом в дополнительном коде, которое при формировании адреса расширяется
знаковым разрядом до 32 разрядов. В качестве индексного регистра Xn при адресации с индексированием может использоваться любой из
регистров данных Dn или адреса An. При прямой адресации абсолютный адрес может задаваться словом Abs.W или длинным словом Abs.L в
зависимости от его разрядности. При непосредственной адресации используются 8-разрядные (Im8), 16-разрядные (Im16) или 32-разрядные
(Im32) операнды.
При адресации с индексированием возможно масштабирование индекса, которое осуществляется умножением
содержимого индексного регистра Xn на масштабный множитель scale, который может иметь значения 1,2,4 или 8. В зависимости от
значения символа разрядности sz, указываемого после имени индексного регистра, для формирования адреса операнда используется
16 или 32 разряда его содержимого. Если после имени регистра Xn указан символ W (слово), то индексом служат 16 младших разрядов
содержимого Xn, которые расширяются знаком до 32 разрядов; если указан символ L (длинное слово), то индексом служит 32-разрядное
содержимое Xn, используемое как число со знаком. При scale=1 содержимое Xn остается без изменения, при значениях scale=2,4 или 8
производится его сдвиг, соответственно, на 1,2 или 3 разряда влево. При программировании на языке Ассемблера значение индекса
задается в поле операнда записью Xn.sz*scale (табл.3.1), где X имеет значение A (регистра адреса) или D (регистр данных), sz -
значение W или L, scale - значение 1,2,4 или 8. Например, запись A3.W*2 означает, что индексом служит содержимое 16 младших разрядов
регистра адреса A3, сдвинутое на один разряд влево и расширенное знаком до 32 разрядов.
Для косвенно-регистровой и относительной адресации с индексацией возможно использование 32-разрядного
базового смещения bd (номера 13,14 в табл.3.1). В этом случае эффективный адрес операнда формируется также, как при использовании
8-разрядного смещения d8 (номера 7,11 в табл.3.1), однако формат команды расширяется для введения 32-разрядного значения bd (рис.3.4,в)
EA = ( An или PC ) + ( Xn )*scale+ bd.
Отметим, что текущее содержимое PC, используемое для вычисления относительного адреса, равно адресу первого
слова выполняемой команды, увеличенному на 2. Для формирования адреса используется 32-разрядное содержимое регистров, однако в
качестве физического адреса на шину адреса A23-0 выводятся только 24 младших разряда. Значение адреса, полученное одним из указанных
способов, называется эффективным адресом [EA].
Процессор CPU32 не имеет специальных команд ввода-вывода данных. При обращении к внешним устройствам их
адрес формируется так же, как при обращении к ячейкам памяти, с использованием перечисленных выше способов адресации. Если
сформированный адрес оказывается адресом внешнего устройства, то оно является источником или приемником данных (операндов).
Выполняемые процессором команды могут быть двухадресными, одноадресными и безадресными. На рис.3.4,а
показан формат типовой двухадресной команды, где поле COP определяет вид операции, поле OPM - разрядность операндов и размещение
результата, поле Rn содержит номер регистра n, в котором находится один операнд, поля MODE и REG задают способ адресации второго
операнда (табл.3.1). Таким образом, один операнд всегда выбирается из регистра, второй - из регистра или памяти, результат операции
размещается на месте одного из операндов. В табл.3.1 указаны символические обозначения адреса операнда на языке ассемблера в
соответствии со способом адресации, используемым для его формирования.
в) |
Im8, 16 или Im32 |
d16 для или Abs. W, L или bd |
d16 для или Abs. W, L или bd |
Рис.3.4. Формат типовой команды
При адресации с индексированием команда содержит второе слово, формат которого
показан на рис.3.4,б. Бит D/A этого слова указывает тип регистра, который используется в качестве индексного: при D/A=0 -
регистр данных (Xn=Dn), при D/A=1 - регистр адреса (Xn=An); поле Xn содержит номер регистра n; бит W/L определяет разрядность
индекса: при W/L=0 индексом служит содержимое 16 младших разрядов индексного регистра, которые расширяются знаковым разрядом до
32-разрядного числа, при W/L=1 индексом служит 32-разрядное содержимое регистра. На языке ассемблера разрядность индекса
определяется символами W или L, указываемыми после имени регистра Xn (.sz в табл.3.1). Поле d8 содержит 8-разрядное смещение в
дополнительном коде.
Ряд способов адресации требует введения в команду дополнительных слов (рис.3.4,в). При непосредственной
адресации после первых слов (одного или двух), определяющих вид операции и способы адресации, следует одно или два слова, содержащих
операнды Im8, Im16 или Im32. Если при адресации первого (< src >) или второго (< dst >) операнда используется 16-разрядное смещение
d16, либо абсолютный адрес, имеющий разрядность слова (Abs.W) или двойного слова (Abs.L), то они также указываются в отдельных словах
команды. Поэтому команды имеют длину от 1 до 5 слов.
|