Написал постфиксный ассемблер для КР1878ВЕ1. Хотел попробовать написать ассемблер для микроконтроллера, простоты ради выбрал именно этот. Написал на Forth, поэтому синтаксис у ассемблера соответствующий: вместо instruction <destination> <source> пишется <source> <destination> instruction. Привычный синтаксис только у команд jmp/jnz/jz/... : instruction <label>. Это связано с тем, как ассемблер обрабатывает ссылки вперед.
Не суть важно. Можно это воспринимать просто как аналог ассемблеру от Ангстрема (который TESSA.EXE на их сайте).
- Программа-пример из документации микроконтроллера: test.mic, я скармливал ее TESSA.EXE и сравнивал получившийся результат со своим
- ассемблер вместе с программой-примером, она начинается после комментария "test program", можно сравнить синтаксис с оригиналом: test.fs, запускать на Linux/BSD/OS X под gforth
- несколько слов, опосредованно относящихся к ассемблеру: common.fs, вынес их в отдельный файл
Итак, подхожу к собственно вопросу...
В процессе сравнения результатов заметил несоответствие в обработке инструкции LDR. Согласно документации, она имеет такой формат:
Мой ассемблер, как и в случае с остальными инструкциями, у которых два операнда, генерирует опкод так: операнд2 (в данном случае constant) сдвигается влево на ширину операнда1 (в данном случае register), потом OR их вместе, потом еще раз OR с кодом команды. Следуя этой логике, строка LDR #C,15 должна генерировать такой опкод:Код:0010 0ccc cccc cnnn constant regВместо этого TESSA.EXE генерит такой код:Код:0010 0000 0111 1010Я поэкспериментировал, и получается, что для инструкции LDR ассемблер Ангстрема не сдвигает константу влево, и накладывает три бита регистра прямо поверх нее. Еще показательный пример: LDR #A,7. В теории опкод такой:Код:0010 0000 0000 1010У TESSA.EXE такой:Код:0010 0000 0011 1000У меня есть сильное подозрение, что это баг или глюк в TESSA.EXE. Но как-то трудно поверить, что программисты в Ангстреме могли его не заметить. Эта инструкция, кажется, четыре раза встречается в программе-примере из официальной документации, и дважды она генерирует неверный код (в моем понимании).Код:0010 0000 0000 0000
Есть ли у кого-нибудь возможность проверить работу программы на реальном микроконтроллере? Может, я что-то неверно понял в логике работы инструкции LDR?
P.S. Насчет самого ассемблера: я таки могу допилить его напильником и сделать менее похожим на полуфабрикат. Как минимум, скомпилировать на Windows в виде отдельного EXE-файла, который будет кушать ассемблерный исходник в STDIN. Если кому интересно, конечно.




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

