Раздел 2. Архитектура и системы команд современных пэвм и ARM7. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Раздел 2. Архитектура и системы команд современных пэвм и ARM7.



Раздел 2. Архитектура и системы команд современных ПЭВМ и ARM7.

 

Общий формат команд в режиме ARM.

 

 

Формат построения системы команд в режиме ARM

Примечание: некоторые коды команд не определены, но в то же время их выполнение не вызывает исключения "неизвестная команда" (Undefined instruction exception), кроме команды умножения с установленным в "1" битом 6. Эти команды не должны применяться, хотя, некоторые из них могут быть реализованы в новых версиях ядра ARM.

 

4. Машинные команды ARM.

 

Система команд в режиме ARM

 

Мнемоника Команда Действие
ADC Сложение с переносом Rd:= Rn + Op2 + перенос
ADD Сложение Rd:= Rn + Op2
AND Логическое И Rd:= Rn AND Op2
B Переход R15:= адрес
BIC Очистить бит Rd:= Rn AND NOT Op2
BL Переход со ссылкой R14:= R15, R15:= адрес
BX Переход и переключение режима ядра R15:= Rn, T бит:= Rn[0]
CDP Обработать данные сопроцессором (зависит от типа сопроцессора)
CMN Сравнить с отрицательным операндом CPSR флаги:= Rn + Op2
CMP Сравнение CPSR флаги:= Rn - Op2
EOR Исключающее ИЛИ Rd:= (Rn AND NOT Op2) OR (op2 AND NOT Rn)
LDC Загрузить в сопроцессор из памяти Загрузить в сопроцессор
LDM Загрузить сразу несколько регистров Манипуляции со стеком (Pop)
LDR Загрузить регистр из памяти по указанному адресу Rd:= (адрес)
MCR Скопировать регистр CPU в регистр сопроцессора cRn:= rRn {<op>cRm}
MLA Умножение со сложением Rd:= (Rm * Rs) + Rn
MOV Загрузить в регистр константу Rd: = Op2
MRC Скопировать регистр сопроцессора в регистр CPU Rn:= cRn {<op>cRm}
MRS Переместить регистр статуса/флагов PSR в регистр Rn Rn:= PSR
MSR Загрузить в PSR статус/флаги указанный регистр PSR:= Rm
MUL Умножение Rd:= Rm * Rs
MVN Загрузить регистр отрицательной константой Rd:= 0xFFFFFFFF EOR Op2
ORR Логическое ИЛИ Rd:= Rn OR Op2
RSB Обратное вычитание Rd:= Op2 - Rn
RSC Обратное вычитание с переносом Rd:= Op2 - Rn - 1 + Перенос
SBC Вычитание с переносом Rd:= Rn - Op2 - 1 + Перенос
STC Сохранить регистр сопроцессора в памяти адрес:= CRn
STM Сохранить сразу несколько регистров Манипуляции со стеком (Push)
STR Сохранить регистр в памяти <адрес>:= Rd
SUB Вычитание Rd:= Rn - Op2
SWI Программное прерывание Вызывается операционной системой
SWP Обменять местами содержимое регистра и памяти Rd:= [Rn], [Rn]:= Rm
TEQ Побитовая проверка на равенство CPSR флаги:= Rn EOR Op2
TST Проверка битов CPSR флаги:= Rn AND Op2

 

Поле условия.

 

В режиме ARM все команды выполняются в зависимости состоянию регистра CPSR и поля условия самой команды. Это поле (биты 31:28) содержит условие, при которых команда будет выполнена. Если флаги C, N, Z и V установлены (сброшены) согласно коду поля условия, то команда будет выполнена, в противном случае эта команда будет проигнорирована.

Всего существуют 16 различных условий, каждое из которых определяется двухсимвольным суффиксом, добавляемым к мнемонике команды. Например, команда переход (Branch - "B" в ассемблере) становится командой перейти, если равно - BEQ (Branch if Equal), которая означает, что переход будет выполнен, если установлен флаг Z.

Практически можно использовать только 15 различных условий, 16-е условие (1111) зарезервировано и не применяется.

При отсутствии в мнемонике команды условия выполнения или установлен суффикс AL, то эта команда будет выполнена безусловно, независимо от состояния флагов условия (регистр CPSR).

 


Перечень условий выполнения.

 

Код Суффикс Флаги Значение
0000 EQ Z установлен Равно
0001 NE Z сброшен Не равно
0010 CS C установлен Выше или равно
0011 CC C сброшен Ниже
0100 MI N установлен Отрицательный результат
0101 PL N сброшен Положительный результат либо ноль
0110 VS V установлен Переполнение
0111 VC V сброшен Нет переполнения
1000 HI C установлен and Z сброшен Выше
1001 LS C сброшен or Z установлен Ниже или равно
1010 GE N равно V Больше или равно
1011 LT N не равно V Меньше
1100 GT Z сброшен AND (N равно V) Больше
1101 LE Z установлен OR (N не равно V) Меньше или равно
1110 AL (проигнорировано) Всегда

 

Обработка данных.

 

Эта команда будет выполнена, если условие истинно. Все различные условия перечислены ниже. Машинный код команды приведен на рисунке.

 

Команда обработки данных

 

Команда формирует результат, выполняя указанную арифметическую или логическую операцию с одним или двумя операндами.

Первый операнд - всегда регистр (Rn). Второй операнд может быть регистром со сдвигом (Rm), или 8-битной константой с циклическим сдвигом (Imm) (в зависимости от значения бита "I" в команде). Флаги CPSR могут оставаться без изменений (S = 0) или выставлены в зависимости от результата выполнения этой команды (S = 1). Некоторые операции в команде (ТЕСТ, TEQ, CMP, CMN) не записывают результат в регистр Rd. Они используются только для того, чтобы в зависимости от результата установить/сбросить флаги CPSR (только при S = 1). Команды и результаты их работы перечислены в таблице ниже.

 

Флаги регистра CPSR

 

Все операции обработки данных разделяются на: логические и арифметические. Логические операции (AND, EOR, ТЕSТ, TEQ, ORR, MOV, BIC, MVN) выполняют логические побитовые операции на всех битах операнда или операндов. Если бит команды "S" будет установлен (и Rd - это не R15, см. ниже), то состояние флага "V" в регистре CPSR не изменится; флаг переноса "C" будет установлен исходя из результата многорегистрового циклического сдвига (или останется без изменений, если операция изменения сдвига - LSL #0). Флаг "Z" будет установлен, только если результат - все нули, и флаг "N" будет установлен в зависимости от значения бита 31 результата операции.

Арифметические операции (SUB, RSB, ADD, ADC, SBC, RSC, CMP, CMN) обрабатывают каждый операнд как 32-битное целое число (беззнаковое или знаковое с дополнением до 2-х, что, впрочем, эквивалентно). Если бит "S" будет установлен (и Rd - это не R15) и произойдет переполнение результата, то флаг "V" в регистре CPSR будет установлен. Однако, этот флаг можно игнорировать, если операнды - беззнаковые, но обязательно нужно учитывать для знаковых операндов. Флаг "C" будет установлен при переносе бита 31 из ALU (переполнение). Флаг "Z" будет установлен, только если результат нулевой. Флаг "N" будет установлен в зависимости от значения бита 31 результата операции (указывает на отрицательный результат, если предполагается, что операнды есть знаковые с дополнением до 2-х).

 

Команды сдвига

 

Когда второй операнд определен как сдвиговый регистр, то операцией регистрового циклического сдвига управляет поле Shift в самой команде. Это поле указывает тип сдвига, который будет выполнен: логический сдвиг влево или вправо, арифметический сдвиг право, или циклический сдвиг вправо. Число бит, на которое будет произведен сдвиг, находится или в старшей части операнда 2 (сдвиг регистра кроме R15 при I = 0) или его в старших 4-х битах (сдвиг константы при I = 1). Подробное описание для различных типов сдвигов приведено на рисунке.

 

 

Команды сдвига в режиме ARM

 

Логический сдвиг влево

 

Примечание: особого рассмотрения требует команда LSL #0, в которой выталкиваемый бит (перенос) равен прежнему содержимому флага C регистра CPSR. Содержимое Rm используется непосредственно в качестве 2-го операнда.

 

Команда логического сдвига вправо (LSR) похожа на команду LSL, с одной лишь разницей: содержимое регистра Rm сдвигается в сторону младших бит. Для примера на рисунке изображен принцип работы команды LSR #5.

 

Логический сдвиг вправо

 

Так как команда LSR #0 в принципе не выполняет никаких действий, и по причине ограниченного размера поля сдвига (shift) не может существовать команды LSR #32 (результат работы которой: операнд 2 = нулю), то решено было заменить LSR #32 командой LSR #0 (это относится и к команде LSL #32). По этой причине оптимизатор ассемблера заменит команды LSR #0, ASR #0, ROR #0 командой LSL #0, хотя фактически будет выполняться команда LSL #32.

Команда арифметического сдвига вправо (ASR) выполняет те же действия, что и команда логического сдвига вправо (LSR), с одной разницей в том, что в старшие биты результата копируется содержимое бита 31 регистра Rm, вместо нулей. Так как 31-бит является знаком числа, то это позволяет сохранить этот знак (подразумеваются знаковые числа с дополнением до 2-х). Для примера на рисунке изображен принцип работы команды ASR #5.

 

 

Арифметический сдвиг вправо

Команда ASR #0 (аналогично LSR #0) используется взамен команды ASR #32. В этом случае бит 31 регистра Rm также используется в роле переноса, а результат целиком состоит либо из одних единиц, либо из одних нулей, в зависимости от значения бита 31 регистра Rm.

 

Команда циклического сдвига вправо (ROR) производит побитовые сдвиги вправо с переносом младшего вытесненного бита 0 (перенос) в старший бит 31. Для примера на рисунке изображен принцип работы команды ROR #5.

 

 

Циклический сдвиг вправо

 

Команда расширенного сдвига вправо (RRX) выполняет те же действия, что и команда ROR #0. Во время выполнения этой команды производится сдвиг на один бит вправо 33-битного регистра, получаемого добавлением (не сложением) к старшему значащему биту регистра Rm флага C регистра CPSR.

 

 

Команды сдвига констант

 

Поле сдвига константы - 4-битное целое беззнаковое число, которое указывает число операций сдвига 8-битной константы - байта. Это значение расширятся до 32-битного с дополнением слева нулями, и затем циклически сдвигается вправо на 2 бита. Эти манипуляции позволяют генерировать большую часть часто применяемых констант, например, все значения степени двойки.

 

Запись в регистр R15

 

Если S = 1 и Rd ≠ R15, т.е. в качестве Rd используются любой из регистров, кроме R15, то содержимое флагов регистра CPSR обновиться из флагов АЛУ, как это описано ранее.

Если S = 0 и Rd = R15, то результат выполнения команды помещается в регистр R15, не оказывая никакого влияния на флаги регистра CPSR.

Если S = 1 и Rd = 15, то результат выполнения команды помещается в регистр R15 и соответствующий регистр SRPS текущего режима копируется в регистр CPSR. При изменении состояния ядра это позволяет одновременно восстанавливать и регистр PC и регистр CPSR. Недопустимо использование такого варианта команды в привилегированном режиме (User Mode).

 

Синтаксис в ассемблере

 

1. MOV,MVN (команды с одним операндом)

          <opcode>{cond}{S} Rd,<Op2>

2. CMP,CMN,TEQ,TST (команды без записи результата - без Rd)

<opcode>{cond} Rn,<Op2>

3. AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC

          <opcode>>{cond}{S} Rd,Rn,<Op2>

где:

- <Op2> - это Rm{,<shift>} или {,<#выражение>}

- {cond} - двухсимвольная мнемоника условия.

- {S} - разрешить условное выполнение (для команд CMP, CMN, TEQ, TST).

- Rd, Rn и Rm - выражения, результат вычисления которых - номер регистра общего назначения.

- <#выражение> - если это поле используется, то ассемблер попытается сгенерировать команду сдвига 8-битной константы с соответствии с указанным выражением. Если это невозможно, то возникнет ошибка.

- <shift> - <тип_сдвига> <регистр> или <тип_сдвига> #выражение, или RRX (расширенный циклический сдвиг вправо).

- <shiftname> - ASL, LSL, LSR, ASR, ROR. (так как ASL - синоним LSL, то для обеих команд будет сгенерирован одинаковый машинный код).

 

Пример

 

ADDEQ R2,R4,R5         ; Если Z = 1, то R2:=R4+R5

TEQS R4,#3                   ; Проверить R4 на равенство 3

; (ассемблер автоматически установит в единицу бит S)

SUB R4,R5,R7,LSR R2; Логический сдвиг вправо R7 на такое число бит,

; которое указано в старшем байте регистра R2,

; затем вычесть результат из R5 и разместить его в R4.

MOV PC,R14                ; Возврат из подпрограммы.

MOVS PC,R14               ; Возврат из исключения и восстановление CPSR из SPSR_mode.

 

Неопределенная команда (Undefined).

 

Если условие истинно, то будет выполнен переход на обработчик прерывания при попытке выполнения неопределенный команды (undefined instruction). Машинный код команды приведен на рисунке.

 

 

Неопределенная команда

Число машинных тактов

 

Эта команда выполняется за 2S + 1I + 1N, где S, N и I зависят от типа машинных тактов.

Синтаксис в ассемблере

 

Эта команда не имеет никакой мнемоники в ассемблере. И зарезервирована на будущее, поэтому не должна применяться.

 

Примеры применения команд в режиме ARM.

(Выдать в файле ARM.doc)

 

В примерах, приведенных ниже, указаны основные способы для достижения высокой эффективности кода с применением основных команд ядра ARM7TDMI. Все эти примеры в основном оптимизированы по размеру кода, а не по скорости выполнения (хотя некоторые из примеров все же позволяют достичь достаточно большой скорости их выполнения).

 

Абсолютное значение

 

TEQ Rn,#0        ; Проверить знак

RSBMI Rn,Rn,#0; и, если необходимо, дополнить до 2-х.

 

Умножение на 4, 5 или 6

 

MOV Rc,Ra,LSL#2                  ; Умножить на 4,CMP  Rb,#5                              ; проверить значение,ADDCS Rc,Rc,Ra                        ; закончить умножение на 5,

ADDHI     Rc,Rc,Ra              ; закончить умножение на 6.

 

Раздел 2. Архитектура и системы команд современных ПЭВМ и ARM7.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 49; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.139.162 (0.073 с.)