Кочегаров И.И. Микроконтроллеры AVR. Лабораторный практикум (2012) (1264221), страница 7
Текст из файла (страница 7)
Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP необходимодобавить один цикл плюс по одному циклу для каждого ожидания.POPRdИнструкции работы с битамиМнемоника ОперандыLSLRdLSRRdROLRdRORRdASRRdSWAPRdBSETsBCLRsSBIP,bCBIP,bBSTRr,bBLDRd,bSECНетОписаниеОперацияФлагиRd(n+1)=Rd(n),Z,C,N,V,H,SRd(0)=0,C=Rd(7)Rd(n)=Rd(n+1),Логический сдвигZ,C,N,V,SRd(7)=0,вправоC=Rd(0)Rd(0)=C,Циклический сдвигRd(n+1)=Rd(n), Z,C,N,V,H,Sвлево через CC=Rd(7)Rd(7)=C,Циклический сдвигRd(n)=Rd(n+1), Z,C,N,V,Sвправо через CC=Rd(0)Арифметический Rd(n)=Rd(n+1),Z,C,N,V,Sсдвиг вправоn=0,...,6Rd(3..0) =NoneПерестановка тетрад Rd(7..4), Rd(7..4)= Rd(3..0)SREG(s)Установка флагаSREG(s) = 1Логический сдвигвлевоОчистка флагаУстановить битв портуОчистить битв портуСохранить битиз регистра в TЗагрузить битиз T в регистрУстановить флагпереноса37Циклы1111111SREG(s) = 0SREG(s)1I/O(P,b) = 1None2I/O(P,b) = 0None2T = Rr(b)T1Rd(b) = TNone1C =1C1Мнемоника ОперандыОписаниеОперацияФлагиЦиклыНетОчистить флагпереносаC=0C1НетУстановить флаготрицательногочислаN=1N1CLNНетОчистить флаготрицательногочислаN=0N1SEZНетУстановить флагнуляZ=1Z1CLZНетОчистить флаг нуляZ=0Z1SEIНетУстановить флагпрерыванийI=1I1CLIНетОчистить флагпрерыванийI=0I1SESНетУстановить флагчисла со знакомS=1S1CLNНетОчистить флаг числасо знакомS=0S1SEVНетУстановить флагпереполненияV=1V1CLVНетОчистить флагпереполненияV=0V1SETНетУстановить флаг TT=1T1CLTНетОчистить флаг TT=0T1SEHНетУстановить флагвнутреннегопереносаH=1H1CLHНетОчистить флаг внутреннего переносаH=0H1NOPНетНет операцииНетNone1НетСпать (уменьшитьэнергопотребление)СмотритеописаниеинструкцииNone1НетСброс сторожевоготаймераСмотритеописаниеинструкцииNone1CLCSENSLEEPWDRАссемблер не различает регистр символов.38Операнды могут быть следующих видов:Rd: Результирующий (и исходный) регистр в регистровом файлеRr: Исходный регистр в регистровом файлеb: Константа (3 бита), может быть константное выражениеs: Константа (3 бита), может быть константное выражениеP: Константа (56 бит), может быть константное выражениеK6; Константа (6 бит), может быть константное выражениеK8: Константа (8 бит), может быть константное выражениеk: Константа (размер зависит от инструкции), может быть константное выражениеq: Константа (6 бит), может быть константное выражениеRdl: R24, R26, R28, R30.
Для инструкций ADIW и SBIWX,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28,Z=R31:R30)Директивы ассемблераКомпилятор поддерживает ряд директив. Директивы не транслируются непосредственно в код. Вместо этого они используются дляуказания положения в программной памяти, определения макросов,инициализации памяти и т.д. Список директив приведен в табл. 1.Таблица 1ДирективаОписаниеBYTEЗарезервировать байты в ОЗУCSEGПрограммный сегментDBОпределить байты во флэш или EEPROMDEFНазначить регистру символическое имяDEVICEОпределить устройство для которого компилируется программаDSEGСегмент данныхDWОпределить слова во флэш или EEPROMENDM,Конец макросаENDMACROEQUУстановить постоянное выражениеESEGСегмент EEPROMEXITВыйти из файлаINCLUDEВложить другой файлLISTВключить генерацию листинга39Окончание табл. 1ДирективаОписаниеLISTMACВключить разворачивание макросов в листингеMACROНачало макросаNOLISTВыключить генерацию листингаORGУстановить положение в сегментеSETУстановить переменный символический эквивалент выраженияВсе директивы предваряются точкой.BYTE – Зарезервировать байты в ОЗУДиректива BYTE резервирует байты в ОЗУ.
Если вы хотитеиметь возможность ссылаться на выделенную область памяти, то директива BYTE должна быть предварена меткой. Директива принимает один обязательный параметр, который указывает количество выделяемых байт. Эта директива может использоваться только в сегменте данных (смотреть директивы CSEG и DSEG). Выделенныебайты не инициализируются.Синтаксис:МЕТКА: .BYTE выражениеПример:.DSEGvar1: .BYTE 1; резервирует 1 байт для var1table: .BYTE tab_size; резервирует tab_size байт.CSEGldi r30,low(var1); Загружает младший байт регистра Zldi r31,high(var1); Загружает старший байт регистра Zld r1,Z; Загружает VAR1 в регистр 1CSEG – Программный сегментДиректива CSEG определяет начало программного сегмента.Исходный файл может состоять из нескольких программных сегментов, которые объединяются в один программный сегмент при компиляции.
Программный сегмент является сегментом по умолчанию.Программные сегменты имеют свои собственные счетчики положения, которые считают не побайтно, а пословно. Директива ORG может быть использована для размещения кода и констант в необходимом месте сегмента. Директива CSEG не имеет параметров.40Синтаксис:.CSEGПример:.DSEG; Начало сегмента данныхvartab: .BYTE 4 ; Резервирует 4 байта в ОЗУ.CSEG; Начало кодового сегментаconst: .DW 2; Разместить константу 0x0002 в памяти программmov r1,r0 ; Выполнить действияDB – Определить байты во флэш или EEPROMДиректива DB резервирует необходимое количество байт в памяти программ или в EEPROM. Если вы хотите иметь возможностьссылаться на выделенную область памяти, то директива DB должнабыть предварена меткой.
Директива DB должна иметь хотя бы одинпараметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).Параметры, передаваемые директиве, – это последовательностьвыражений, разделенных запятыми. Каждое выражение должно бытьили числом в диапазоне (128...255), или в результате вычислениядолжно давать результат в этом же диапазоне, в противном случаечисло усекается до байта, причем БЕЗ выдачи предупреждений.Если директива получает более одного параметра и текущимявляется программный сегмент, то параметры упаковываются в слова(первый параметр – младший байт), и если число параметров нечетно, то последнее выражение будет усечено до байта и записано какслово со старшим байтом, равным нулю, даже если далее идет ещеодна директива DB.Синтаксис:МЕТКА: .DB список_выраженийПример:.CSEGconsts: .DB 0, 255, 0b01010101, -128, 0xaa.ESEGconst2: .DB 1,2,3DEF – Назначить регистру символическое имяДиректива DEF позволяет ссылаться на регистр через некотороесимволическое имя.
Назначенное имя может использоваться во всей41нижеследующей части программы для обращений к данному регистру. Регистр может иметь несколько различных имен. Символическоеимя может быть переназначено позднее в программе.Синтаксис:.DEF Символическое_имя = РегистрПример:.DEF temp=R16.DEF ior=R0.CSEGldi temp,0xf0 ; Загрузить 0xf0 в регистр temp (R16)in ior,0x3f ; Прочитать SREG в регистр ior (R0)eor temp,ior ; Регистры temp и ior складываются по искл. илиDEVICE – Определить устройство, для которого компилируется программаДиректива DEVICE позволяет указать, для какого устройствакомпилируется программа.
При использовании данной директивыкомпилятор выдаст предупреждение, если будет найдена инструкция,которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегментEEPROM превысят размер, допускаемый устройством. Если же директива не используется, то все инструкции считаются допустимыми,и отсутствуют ограничения на размер сегментов.Синтаксис:.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 |AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515| AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103 | .
. .Полный список поддерживаемых кристаллов в последней версии ассемблера доступен на сайте производителя[1]Пример:.DEVICE AT90S1200 ; Используется AT90S1200.CSEGpush r30 ; Эта инструкция вызовет предупреждение; поскольку AT90S1200 ее не имеетDSEG – Сегмент данныхДиректива DSEG определяет начало сегмента данных. Исходный файл может состоять из нескольких сегментов данных, которыеобъединяются в один сегмент при компиляции. Сегмент данных42обычно состоит только из директив BYTE и меток. Сегменты данныхимеют свои собственные побайтные счетчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте ОЗУ.
Директива не имеет параметров.Синтаксис:.DSEGПример:.DSEG; Начало сегмента данныхvar1: .BYTE 1; зарезервировать 1 байт для var1table: .BYTE tab_size ; зарезервировать tab_size байт..CSEGldi r30,low(var1) ; Загрузить младший байт регистра Zldi r31,high(var1); Загрузить старший байт регистра Zld r1,Z; Загрузить var1 в регистр r1DW – Определить слова во флэш или EEPROMДиректива DW резервирует необходимое количество слов в памяти программ или в EEPROM.
Если вы хотите иметь возможностьссылаться на выделенную область памяти, то директива DW должнабыть предварена меткой. Директива DW должна иметь хотя бы одинпараметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).Параметры, передаваемые директиве, – это последовательностьвыражений, разделенных запятыми. Каждое выражение должно бытьили числом в диапазоне (32768…65535), или в результате вычисления должно давать результат в этом же диапазоне, в противном случае число усекается до слова, причем БЕЗ выдачи предупреждений.Синтаксис:МЕТКА: .DW expressionlistПример:.CSEGvarlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535.ESEGeevarlst: .DW 0,0xffff,10ENDMACRO – Конец макросаДиректива определяет конец макроопределения, и не принимает никаких параметров.
Для информации по определению макросовсмотрите директиву MACRO.43Синтаксис:.ENDMACROПример:.MACRO SUBI16; Начало определения макросаsubi r16,low(@0) ; Вычесть младший байт первогопараметраsbci r17,high(@0) ; Вычесть старший байт первогопараметра.ENDMACROEQU – Установить постоянное выражениеДиректива EQU присваивает метке значение. Эта метка можетпозднее использоваться в выражениях.