КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Введение. Формирование объектного файла
Язык макрокоманд Формирование объектного файла Недопустимые директивы Все директивы доступны для формирования объектного файла, за исключением директивы ORG. Данную директиву необходимо заменить на директиву CODE, как показано ниже. 6.10.1 Абсолютный код Reset ORG H'OIPF' GOTO Start 6. 10.2 Перемещаемый код Reset CODE H'OIFF' GOTO Start Получить объектный файл можно компиляцией отредактированного исходного текста программы разными версиями MPASM: 1. При использовании MPASM для операционной системы Windows, проверьте установку флага "Object File". 2. В случае использования DOS версии MPASM с управлением из командной строки - введите параметр /о. 3. В оконной версии MPASM для DOS установите "Yes" в строке "Assemble to Object File". Полученный объектный файл будете расширением.о. 6.12 Пример программы 6.12.1 Абсолютный код LIST P=16C54 ftINCLUDE "P16C5X.INC" cblock H '020' mulcnd RES 1; 8-битный множитель mulpir res l; 8-битное множимое H_byte res l; Старший байт 16-битного результата L_byte res l; Младший байт 16-битного результата count res l; Счетчик тру cirf H_byte cirf L_byte movlw 8 movwf count movf mulcnd,w bcf STATUS,С Loop rrf mulpir, F btfsc STATUS,С addwf H_byte,F rrf H_byte,F rrf L_byte,F decfsz count,F goto loop retlw 0 •A****************************************************** ; Тестовая программа start cirw option main movf PORTB, w movwf mulpir movf PORTB,W movwf mulcnd call_m call тру goto main ORG OlFFh goto start END Подпрограмма умножения двух 8-разрядных чисел, может использоваться и в других проектах. Создав объектный файл программы, он может быть подключен к проекту, когда это необходимо. Представленный файл может быть разделен на две части: 1 - вызывная часть, включаемая в основной текст; 2 - основная программа, которая может быть включена в библиотеку. 6.12.2 Перемещаемый код, основная часть LIST Р=1бС54 ftINCLUDE "P16C5X.INC" EXTERN mulcnd, mulpir, H_byte, L_byte EXTERN mpy CODE start cirw option main movf PORTB, W movwf mulpir movf PORTB, W movwf mulcnd call_m call mpy goto main Reset CODE H'OIFF' goto start END 6.12.3 Перемещаемый код, библиотечная часть LIST P=16C54 ftINCLUDE "P16C5X.INC" UDATA mulcnd RES 1; 8-битный множитель mulpir res l; 8-битное множимое H_byte res l; Старший байт 16-битного результата L_byte res l; Младший байт 16-битного результата count res l; Счетчик GLOBAL mulcnd, mulpir, H_byte, L_byte CODE mpy GLOBAL mpy cirf H_byte cirf L_byte movlw 8 movwf count movf muland, W bcf STATUS, С loop rrf mulpir, F btfsc STATUS, С addwf H_byte, F rrf H_byte, F rrf L_byte, F decfsz count, F goto loop retlw 0 END Макрос - определенный пользователем набор инструкций и директив, которые будут подставлены в исходный текст программы при каждом его вызове. Макрос состоит из команд ассемблера и директив, с возможностью указания аргументов, что делает написание программ более гибким. Основные аргументу в пользу использования макросов: более высокий уровень написания программы; текст программы удобен для чтения; уменьшение числа ошибок; упрощение возможных изменений. Использование макросов может быть полезно при: генерации таблиц, применении часто повторяющегося кода, выполнении сложных операций. 7.2 Основные части раздела Синтаксис макрокоманд Директивы макрокоманд Замена текста Использование макросов Примеры программ 7.3 Синтаксис макрокоманд Макросы имеют следующий синтаксис: <label> macro [<argl>,<агд2>..., <агдп>] endm Где: <label> - метка MPASM; <arg> - любое количество необязательных аргументов. При вызове макрокоманды, значение аргументов в теле макроса будут заменены везде, где встречается имя данного параметра. В тело макроса могут быть включены любые инструкции микроконтроллера, директивы или макро-директивы MPASM (например, LOCAL). Описание директив смотрите в главе 5. MPASM продолжает обрабатывать инструкции и директивы тела макроса до тех пор, пока не встретит директиву ЕХ1ТМ или ENDM. Примечание. Для вызова макроса не допускается использование команд ветвления. 7.4 Директивы макрокоманд Часть директив используется для формирования макрокоманды, и не могут использоваться вне макроса: MACRO LOCAL ЕХ1ТМ ENDM При написании макрокоманд Вы можете использовать эти и другие директивы поддерживаемые MPASM. Примечание. Предыдущий синтаксис написания точечных макрокоманд больше не поддерживается. В целях совместимости с предыдущими версиями поддерживается формат ассемблера ASM17. Для обеспечения восходящей совместимости рекомендуется использовать только директивы MPASM, описанные в данном документе. 7.5 Замена текста В пределах тела макроса может быть выполнена замена цепочки символов и значения выражения. <arg> - замена имени аргумента, используется как часть макро обращения; #v(<expr>) - возвращает значение <ехрг>. Используется для создания уникальной переменной с общими приставками или суффиксами. Не может использоваться в директивах условий (IDEF, WHILE). Эти параметры могут использоваться в теле макроса, исключая его выражения. Пример макроса define_table macro local a = О while a < 3 entryftv(a) dw 0 a += 1 endw endm Выполненные действия: entryO dw 0 entryl dw 0 entry 2 dw 0 entry 3 dw 0 7.6 Использование макросов Однажды определенный макрос может использоваться в любой части программы в пределах исходного модуля. Синтаксис вызова макроса: <macro_name> [<arg>,..., <агд>] Где: <macro_name> - название предварительно определенного макроса; <arg> - требуемые аргументы. Макрозапрос не занимает место в памяти программ. Однако тело макроса будет расположено с текущего адреса. Запятые могут использоваться для резервирования положения аргумента. Список аргументов заканчивается символом пробел или точка с запятой. Директива ЕХ1ТМ (см. главу 5) обеспечивает дополнительный метод завершения макроса с игнорированием директивы ENDM. Если используется вложенная структура макросов, то по директиве ЕХ1ТМ вызовет переход на верхний уровень макрокоманд. 7.7 Примеры программ 7.7.1 Умножение двух 8-разрядных чисел Пример макроса умножения двух 8-разрядных чисел для микроконтроллера Р1С17С42 с минимизацией времени вычисления. subtitle "macro definitions" page multiply macro argi, arg2, dest_hi, dest_lo local i = 0; объявление локальной переменной movlw argi; получение множимого movwf mulpir movlw arg2; сохранение множителя в регистре W drf dest_hi; очистка регистров результата cirf dest_lo bcf ALUSTA,С; сброс бита С while i < 8; цикл, пока 8 бит не будут сдвинуты rrcf mulpir btfsc ALUSTA,С addwf dest_hi rrcf dest_hi rrcf dest_lo i += 1 endw; конец вычислений endm; конец макроса В макросе объявляется четыре требуемых аргумента. Директивой LOCAL назначается местная переменная "i", которая будет использоваться как счетчик. При инициализации значение переменной "i" равно нулю. Макрокоманда выполняет умножение по алгоритму, в котором используется сдвиг вправо и дополнение для каждого разряда 8-битного множителя. Директива WHILE используется для организации цикла внутри макроса, пока значение переменной Т меньше 8. Конец цикла отмечен директивой ENDW. Выполнение инструкций внутри цикла будет происходить до тех пор, пока условие WHILE не станет ложным. Завершение макроса отмечено директивой ENDM. 7.7.2 Сравнение констант Пример программы сравнения переменных с использованием макрокоманды. include "16cxx.reg" cfl_jge macro file, con, jump_to movlw con & Oxff subwf file, w btfsc status, carry goto jump_to endm Вызов процедуры макроса: cfl_jge switch_val, max_switch, switch_on Подставленный текст программы: movlw max_switch & Oxff subwf switch_val, w btfsc status, carry goto switch_on
Дата добавления: 2014-11-29; Просмотров: 487; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |