Объектно-ориентированный ассемблер для Microchip PIC16

Особенность данного ассемблера заключается в том, что в нем можно явно выразить связь между данными и методами их обработки. То есть, реализована концепция инкапсуляции данных в объекты.

Для примера предположим, что мы написали на ассемблере функцию подсчета какой-нибудь контрольной суммы. Но в процессе дальнейшей разработки выяснилось, что нужно одновременно считать контрольную сумму для двух-трех-четырех потоков данных. Для каждого потока - свой накопитель контрольной суммы. Классический вариант решения - передавать номер потока в качестве аргумента в функцию подсчета CRC, а там уже через косвенную адресацию модифицировать накопитель CRC. Если для такой задачи этот вариант и допустим, то в более сложных задачах использование косвенной адресации может сильно снизить производительность программы.

В таких случаях имело бы смысл для каждого счетчика CRC сделать отдельную переменную-накопитель и свою копию функции подсчета CRC, которая будет работать именно с этой переменной. Обычно для этого нужно использовать макрорасширения ассемблера и, однажды описав программу, инстанцировать ее столько раз, сколько нужно. В данном объекно-ориентированном ассемблере программа пишется при описании класса, а инстанцирование представляется как создание объектов этого класса.

Другой отличительной чертой компилятора является наличие локальных переменных и менеджера памяти. Представим себе, что у нас есть два цикла, которые идут один за другим. У каждого цикла есть счетчик. Если циклы выполняются последовательно, то в качестве переменных циклов можно использовать одну и ту же переменную. А если один цикл вложен в другой, то непременно надо использовать разные переменных. При классическом программировании на ассемблере программист вынужден следить за тем, какая переменная в каких случаях используется, и случайно не использовать переменную, которая уже занята в момент исполнения участка программы.

В моем компиляторе вопросами распределения памяти занимается компилятор. Программисту больше не надо следить, какая переменная где используется. Мой компилятор корректно отслеживает вложенность блоков программ (он "знает" инструкции call, goto) и сам раскидывает переменные по памяти. Естественно, управление памятью осуществляется на этапе компиляции, а не во время исполнения.

Соединив эти две технологии (наличие объектов и менеджера памяти) получается интересная функциональность: например, есть функция, которая получает пакет данных и вычисляет его контрольную сумму. В этой функции объявляется объект класса "Счетчик CRC", который инициализируется при создании объекта (содержимое его метода init вставляется непосредственно в точку инициализации объекта). У этого счетчика есть поле данных "накопитель CRC". Для него будет отведена ячейка памяти, которая в области видимости этого объекта не занята никакой другой переменной.

Есть и статическая память. Если переменная объявлена как static, то для этой переменной будет отведено фиксированное место, и оно не будет использоваться другими переменными, даже если их области видимости не пересекаются. Поддерживаются массивы - это статические переменные, которым при объявлении указано количество элементов. Обычные переменные всегда отводятся в нулевом банке памяти. Массивы - в первом. Высшие банки [пока] не поддерживаются.

Этот компилятор использовался для написания многих программ. В каталоге examples лежит один из проектов. Так сложилось, что все программы делались на процессоре PIC 16F873/16F876. У других процессоров серии PIC16 система команд абсолютно одинаковая, базовые регистры расположены по тем же адресам, что и у PIC16F873. Отличия будут в адресах регистров. Адреса регистров задаются в файле 16f876.pic. Можете скопировать этот файл под новым именем и поправить под свой процессор. Сейчас в исходниках путь к файлу 16f876.pic прописан жестко. А вообще надо бы сделать опцию командной строки "тип процессора" и подгружать соответствующий файл.

Скачивайте, компилируйте. Для компиляции нужен bison и компилятор c++. Все писалось и тестировалось на Linux, g++. picasm-1.3.tar.gz



Вернуться на главную страницу

100% MS Free Rambler's Top100 Мониторинг сервера осуществляется системой UpTime.Ru
Best viewed with Lynx