asm51

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

Однажды (уже довольно давно) мне нужно было написать программку для 51-го контроллера. Сей для него не было, да и не приходила тогда в голову мысль писать для микроконтроллера на сях (да... и правда давно было :)). Поэтому из и-нета добыл несколько разных ассемблеров и сел с ними разбираться...
Да... Не помню, что в последний раз нагоняло на меня такую тоску. Из 4х найденных мной программ, ни одна не была без существенных изъянов. То не понимает названий специальных регистров, или путает их. То неправильно работает относительная адресация. То не вычисляются выражения.. То безумная идея выводить листинг в файл и искать ошибки по всему этому файлу...

Я перечислил только самые вопиющие недостатки, наличие которых заставило отказаться от идеи использовать готовый асм. К тому же я имел перед глазами вдохновляющий пример написанного коллегой ассемблера для процессора 8085. Мне очень понравилась реализованная там идея с локальными метками. Захотелось сделать нечто подобное и в асме для 51го...
Локальная метка имеет специальный синтаксис - подчёрк и цифру. Например _1, _5 и так далее.
А ссылка в программе выглядит так: jnb p0.1, _1b здесь переход происходит на метку _1, находящуюся до команды перехода (back, назад).
А если ссылка выглядит так: jnb p0.0, _2f, то переход происходит на метку, находящуюся после этой ссылки (forward, вперёд).

Пример 1.

 org 020h

    jnb p0.0, _2f
    clr p0.0
_1: setb p0.0
    jnb p0.0, _1b

    clr p0.1
_1: setb p0.1
    jnb p0.1, _1b
_2: nop
    mov r1, 08
    mov r1, 0xa
    mov r1, 0aH
    mov r1, 77o
    mov r1, 11010101b
  mov r1, 0x1+'a'
   mov r1, 0x1 *2
   mov r1, 0x1 << 2
   
   .include "foo.a51"

В первой команде ссылка указывает на 8ю команду.
В 4ой команде сслыка указывает на 3ю.
И в 7ой команде ссылка указывает на 6ю.

Прошу обратить внимание, что метка _1 повторяется, но это не опечатка, и ассемблер прекрасно понимает, что имеется в виду.
В программах на ассемблере используется довольно много близко (от команды перехода) расположенных меток. И лично меня напрягает придумывать им уникальные названия.
Впрочем, если кому идея не нравится, может эти локальные метки не использовать. Для названий подпрограмм или каких-либо ключевых мест в программе я использую традиционные глобальные метки.

Assembler для 8051 лежит здесь. Будет время и желание, напишу к нему какой-нибудь сопроводительный текст.
Он создан с применением замечательной программы yacc (авторы yacc Давидов Михаил Изгияевич и Антонов Вадим Геннадьевич, МОСКВА - 1985).

UPDATE чтобы не потерялся выкладываю исходник на YACC и турбоси 1.0

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

Сайт создан в системе uCoz