
Архитектура построения и средства защиты СПЦС. Поздышева О.В., Мордовин А.И
.pdf2.2. Команды пересылки данных
Команды, выполняющие пересылку данных, можно объединить в следующую таблицу (табл. 2.1).
|
|
Таблица 2.1 |
|
Команды пересылки данных |
|
Команда |
|
Значение |
MOV A,Rn |
|
Пересылка в аккумулятор из регистра (n = 0…7) |
MOV A,direct |
|
Пересылка в аккумулятор прямо-адресуемого |
|
байта |
|
|
|
|
MOV A,@Ri |
|
Пересылка в аккумулятор косвенно- |
|
адресуемого байта ОЗУ |
|
|
|
|
MOV A,#data |
|
Загрузка в аккумулятор константы |
MOV Rn,A |
|
Пересылка в регистр из аккумулятора |
MOV Rn,direct |
|
Пересылка в регистр прямо-адресуемого байта |
MOV Rn,#data |
|
Загрузка в регистр константы |
MOV direct,A |
|
Пересылка по прямому адресу аккумулятора |
MOV direct,Rn |
|
Пересылка по прямому адресу регистра |
MOV direct,direct |
|
Пересылка прямо-адресуемого байта по |
|
прямому адресу |
|
|
|
|
MOV direct,@Ri |
|
Пересылка косвенно-адресуемого байта ОЗУ по |
|
прямому адресу |
|
|
|
|
MOV direct,#data |
|
Пересылка по прямому адресу константы |
MOV @Ri,A |
|
Пересылка в косвенно-адресуемую ячейку ОЗУ |
|
аккумулятора |
|
|
|
|
|
|
Пересылка в косвенно-адресуемую ячейку ОЗУ |
MOV @Ri,direct |
|
прямо-адресуемого |
|
|
байта |
MOV @Ri,#data |
|
Пересылка в косвенно-адресуемую ячейку ОЗУ |
|
константы |
|
|
|
|
MOV |
|
Загрузка указателя данных |
DPTR,#data16 |
|
|
|
|
|
MOVC |
|
Пересылка в аккумулятор байта из памяти |
A,@A+DPTR |
|
программ |
MOVC A,@A+PC |
|
Пересылка в аккумулятор байта из памяти |
|
программ |
|
|
|
31

|
Продолжение табл. 2.1 |
|
Команда |
Значение |
|
MOVX A,@Ri |
Пересылка в аккумулятор байта из внешней |
|
памяти данных |
||
|
||
MOVX @Ri,A |
Пересылка байта из аккумулятора во внешнюю |
|
память данных |
||
|
||
MOVX A,@DPTR |
Пересылка в аккумулятор из расширенной |
|
внешней памяти данных |
||
|
||
MOVX @DPTR,A |
Пересылка из аккумулятора в расширенную |
|
внешнюю память данных |
||
|
||
PUSH direct |
Загрузка в стек |
|
POP direct |
Извлечение из стека |
|
XCH A,Rn |
Обмен аккумулятора с регистром |
|
XCH A,direct |
Обмен аккумулятора с прямо-адресуемым |
|
байтом |
||
|
||
XCH A,@Ri |
Обмен аккумулятора с косвенно-адресуемым |
|
байтом ОЗУ |
||
|
||
|
Обмен младшей тетрады аккумулятора с |
|
XCHD A,@Ri |
младшей тетрадой |
|
|
косвенно-адресуемого байта ОЗУ |
2.3. Команды арифметических операций
Команды, выполняющие арифметические операции, можно объединить в следующую таблицу (табл. 2.2).
|
|
Таблица 2.2 |
|
Команды арифметических операций |
|
Команда |
|
Значение |
ADD A,Rn |
|
Сложение аккумулятора с регистром (n = 0…7) |
ADD A,direct |
|
Сложение аккумулятора с прямо-адресуемым |
|
байтом |
|
|
|
|
ADD A,@Ri |
|
Сложение аккумулятора с косвенно-адресуемым |
|
байтом ОЗУ |
|
|
|
|
ADD A,#data |
|
Сложение аккумулятора с константой |
ADDC A,Rn |
|
Сложение аккумулятора с регистром и переносом |
32
|
Продолжение табл. 2.2 |
|
Команда |
Значение |
|
ADDC A,direct |
Сложение аккумулятора с прямо-адресуемым |
|
байтом и переносом |
||
|
||
ADDC A,@Ri |
Сложение аккумулятора с косвенно-адресуемым |
|
байтом ОЗУ и переносом |
||
|
||
ADDC A,#data |
Сложение аккумулятора с константой и |
|
переносом |
||
|
||
SUBB A,Rn |
Вычитание из аккумулятора регистра и заема |
|
SUBB A,direct |
Вычитание из аккумулятора прямо-адресуемого |
|
байта и заема |
||
|
||
SUBB A,@Ri |
Вычитание из аккумулятора косвенно- |
|
адресуемого байта ОЗУ и заема |
||
|
||
SUBB A,#data |
Вычитание из аккумулятора константы и заема |
|
INC A |
Инкремент аккумулятора |
|
INC Rn |
Инкремент регистра |
|
INC direct |
Инкремент прямо-адресуемого байта |
|
INC @Ri |
Инкремент косвенно-адресуемого байта ОЗУ |
|
DEC A |
Декремент аккумулятора |
|
DEC Rn |
Декремент регистра |
|
DEC direct |
Декремент прямо-адресуемого байта |
|
DEC @Ri |
Декремент косвенно-адресуемого байта ОЗУ |
|
INC DPTR |
Инкремент указателя данных |
|
MUL AB |
Умножение аккумулятора на регистр В |
|
DIV AB |
Деление аккумулятора на регистр В |
|
DA A |
Десятичная коррекция аккумулятора |
2.4. Команды логических операций
Команды, выполняющие логические операции, можно объединить в следующую таблицу (табл. 2.3).
|
|
Таблица 2.3 |
|
Команды логических операций |
|
Команда |
|
Значение |
ANL A,Rn |
|
Логическое И аккумулятора и регистра |
ANL A,direct |
|
Логическое И аккумулятора и прямо- |
|
адресуемого байта |
|
|
|
33

|
Продолжение табл. 2.3 |
|
Команда |
Значение |
|
ANL A,@Ri |
Логическое И аккумулятора и косвенно- |
|
адресуемого байта ОЗУ |
||
|
||
ANL A,#data |
Логическое И аккумулятора и константы |
|
ANL direct,A |
Логическое И прямо-адресуемого байта и |
|
аккумулятора |
||
|
||
ANL direct,#data |
Логическое И прямо-адресуемого байта и |
|
константы |
||
|
||
ORL A,Rn |
Логическое ИЛИ аккумулятора и регистра |
|
ORL A,direct |
Логическое ИЛИ аккумулятора и прямо- |
|
адресуемого байта |
||
|
||
ORL A,@Ri |
Логическое ИЛИ аккумулятора и косвенно- |
|
адресуемого байта ОЗУ |
||
|
||
ORL A,#data |
Логическое ИЛИ аккумулятора и константы |
|
ORL direct,A |
Логическое ИЛИ прямо-адресуемого байта и |
|
аккумулятора |
||
|
||
ORL direct,#data |
Логическое ИЛИ прямо-адресуемого байта и |
|
константы |
||
|
||
XRL A,Rn |
Исключающее ИЛИ аккумулятора и регистра |
|
XRL A,direct |
Исключающее ИЛИ аккумулятора и прямо- |
|
адресуемого байта |
||
|
||
XRL A,@Ri |
Исключающее ИЛИ аккумулятора и косвенно- |
|
адресуемого байта ОЗУ |
||
|
||
XRL A,#data |
Исключающее ИЛИ аккумулятора и константы |
|
XRL direct,A |
Исключающее ИЛИ прямо-адресуемого байта и |
|
аккумулятора |
||
|
||
XRL direct,#data |
Исключающее ИЛИ прямо-адресуемого байта и |
|
константы |
||
|
||
CLR A |
Сброс аккумулятора |
|
CPL A |
Инверсия аккумулятора |
|
RL A |
Сдвиг аккумулятора влево циклический |
|
RLC A |
Сдвиг аккумулятора влево через перенос |
|
RR A |
Сдвиг аккумулятора вправо циклический |
|
RRC A |
Сдвиг аккумулятора вправо через перенос |
|
SWAP A |
Обмен местами тетрад в аккумуляторе |
34
2.5. Команды операций над битами
Команды, выполняющие операции над битами, можно объединить в следующую таблицу (табл. 2.4).
Таблица 2.4
|
Команды операций над битами |
|
Команда |
Значение |
|
CLR C |
Сброс переноса |
|
CLR bit |
Сброс бита |
|
SETB C |
Установка переноса |
|
SETB bit |
Установка бита |
|
CPL C |
Инверсия переноса |
|
CPL bit |
Инверсия бита |
|
ANL C,bit |
Логическое И бита и переноса |
|
ANL C,/bit |
Логическое И инверсии бита и переноса |
|
ORL C,bit |
Логическое ИЛИ бита и переноса |
|
ORL C,/bit |
Логическое ИЛИ инверсии бита и переноса |
|
MOV C,bit |
Пересылка бита в перенос |
|
MOV bit,C |
Пересылка переноса в бит |
|
JC rel |
Переход, если перенос равен единице |
|
JNC rel |
Переход, если перенос равен нулю |
|
JB bit,rel |
Переход, если бит равен единице |
|
JNB bit,rel |
Переход, если бит равен нулю |
|
JBC bit,rel |
Переход, если бит установлен, с последующим |
|
сбросом бита |
||
|
35
2.6. Команды передачи управления
Команды, выполняющие передачу управления, можно объединить в следующую таблицу (табл. 2.5).
Таблица 2.5
|
Команды передачи управления |
|
Команда |
|
Значение |
ACALL addr11 |
|
Абсолютный вызов подпрограммы в пределах |
|
страницы в 2 Кбайта |
|
|
|
|
LCALL addr16 |
|
Длинный вызов подпрограммы |
RET |
|
Возврат из подпрограммы |
RETI |
|
Возврат из подпрограммы обработки |
|
прерывания |
|
|
|
|
AJMP addr11 |
|
Абсолютный переход внутри страницы в 2 |
|
Кбайта |
|
|
|
|
LJMP addr16 |
|
Длинный переход в полном объеме памяти |
|
программ |
|
|
|
|
SJMP rel |
|
Короткий относительный переход внутри |
|
страницы в 256 байт |
|
|
|
|
JMP @A+DPTR |
|
Косвенный относительный переход |
JZ rel |
|
Переход, если аккумулятор равен нулю |
JNZ rel |
|
Переход, если аккумулятор не равен нулю |
CJNE |
|
Сравнение аккумулятора с прямо-адресуемым |
A,direct,rel |
|
байтом и переход, если не равно |
CJNE A,#data,rel |
|
Сравнение аккумулятора с константой и |
|
переход, если не равно |
|
|
|
|
CJNE Rn,#data,rel |
|
Сравнение регистра с константой и переход, |
|
если не равно |
|
|
|
|
CJNE |
|
Сравнение косвенно-адресуемого байта ОЗУ с |
@Ri,#data,rel |
|
константой и переход, если не равно |
DJNZ Rn,rel |
|
Декремент регистра и переход, если не нуль |
DJNZ direct,rel |
|
Декремент прямо-адресуемого байта и переход, |
|
если не нуль |
|
|
|
|
NOP |
|
Холостая команда |
36
2.7. Программирование в среде Keil
Для систем с микроконтроллерами 8051 разработаны мощные инструментальные средства, позволяющие снизить до минимума время разработки и отладки программного обеспечения. Среди прочих лидирующие позиции занимают программные средства, разработанные фирмой Keil. Инструментальные средства этой фирмы включают целый ряд мощных приложений, таких как компилятор языка C для микроконтроллеров 8051, известный под названием Keil C51, макроассемблер A51, совместимый с ASM$51, и наконец, удобная графическая оболочка для разработки и отладки программ Keil uVision.
Среда разработки Keil uVision (в настоящее время используются версии 2 и 3) позволяет создавать сколь угодно сложные проекты, состоящие из разных модулей, написанных как на C, так и на языке ассемблера, подключать библиотеки функций и т.д. Кроме того, эта среда включает удобный отладчик (симулятор), позволяющий оценить и быстро проверить работоспособность программы. Хотя при разработке программ можно обойтись только командной строкой, откомпилировав и собрав программу вне среды Keil uVision, графическая среда раз работки все же более удобна, поскольку позволяет автоматизировать сборку программ и проверить их работоспособность с помощью отладчика.
Для разработки и отладки программ в среде Keil желательно иметь установленную графическую среду Keil uVision версии 2 или 3 и компиляторы C51 и A51. Можно использовать демонстрационные версии этих программных инструментов, доступные для скачивания на сайте www.keil.com. Все примеры, приведенные в этой главе, будут работать в демонстрационной версии среды Keil. Более того, для разработки программ на языке C в среде Keil uVision можно использовать и свободно распространяемый компилятор SDCC, который разработан в рамках открытого лицензионного соглашения GNU и не имеет ограничений по размеру
37
исполняемого программного кода. Несмотря на некоторые отличия в синтаксисе, многие (если не большинство) из принципов программирования систем с 8051, используемые в
Keil C51, работают и в SDCC.
2.8.Интерфейс с языком ассемблера
Вцелом ряде случаев, особенно при работе с внешними устройствами, для повышения эффективности программного кода и упрощения разработки программы имеет смысл использовать язык ассемблера. Например, при работе с быстродействующими аналого-цифровыми преобразователями можно применить отдельные процедуры для считывания двоичного кода по интерфейсу SPI. В целом ряде случаев при программировании обмена данными с периферийным оборудованием программист сталкивается с необходимостью реализации сложных алгоритмов обмена данными, требующих использования многочисленных манипуляций с отдельными битами, что при применении только операторов языка высокого уровня может оказаться весьма затруднительным.
Втаких случаях намного быстрее и проще решить задачу, применив в программе на C ассемблерный код. Единственное, что требуется от программиста при разработке ассемблерного кода, – достаточно хорошее понимание программной архитектуры микроконтроллера и системы команд.
Компилятор C51 позволяет работать как со встроенными (inline) ассемблерными вставками, так и с процедурами на ассемблере, которые можно хранить в отдельном файле с расширением .asm. В последнем случае можно оттранслировать исходный ASM-файл при помощи компилятора a51.exe, а затем скомпоновать программу с помощью компоновщика bl51.exe.
38
2.9. Программирование на языке ассемблера в среде Keil
До сих пор мы рассматривали язык ассемблера как вспомогательное средство при разработке программ на Keil C51. Тем не менее в целом ряде случаев, особенно когда не требуется создавать сложный интерфейс пользователя, а требуется лишь работа с оборудованием, программы на языке ассемблера работают очень эффективно. Слабым местом ассемблера традиционно считается трудность реализации математических функций и обработки сложных типов данных (длинных целых чисел, чисел с плавающей точкой), а также функции преобразования различных типов данных. Тем не менее в Интернете имеется масса исходных текстов программ, позволяющих решить эти и другие проблемы, значительно расширив при этом возможности программ на ассемблере. В принципе, настроив среду программирования соответствующим образом и подключив необходимые библиотеки функций, можно решать практически любые задачи по программированию 8051-систем.
Синтаксис этого языка во многом похож на тот, что используется в «классическом» ASM$51. В программе на ассемблере A51 можно определять сегменты кода (абсолютные и перемещаемые), а также сегменты данных, указывая для них тип используемой памяти (DATA, IDATA, XDATA, CONST и
т.д.). Описание языка ассемблера A51 довольно обширно и может занять несколько сотен страниц, поэтому мы не будем углубляться в детали функционирования A51, а на практических примерах посмотрим, как создаются исполняемые файлы программ на ассемблере.
Вначале создадим ассемблерный вариант программы
«Hello, World» вне среды программирования Keil uVision.
Наберем в текстовом редакторе исходный текст программы:
39
NAME PROCS
ESC EQU 1Bh
MAIN SEGMENT CODE myData SEGMENT CODE CSEG AT 0
USING 0 JMP start RSEG MAIN start:
MOV SCON, #50h MOV TH1, #0FDh ORL TMOD, #20h SETB TR1
MOV DPTR, #text next_byte:
CLR TI
CLR A
MOVC A, @A+DPTR CJNE A, #ESC, write_char SJMP $
write_char: MOV SBUF, A JNB TI, $ INC DPTR
SJMP next_byte RSEG myData
text: DB ‘Hello, World’, ESC
END
Поскольку микроконтроллер после включения питания начинает выполнение программы с абсолютного адреса 0 в сегменте программ, то в начале нашего листинга указана директива
CSEG AT 0
40