Нужно ли знать и уметь программировать на ассемблере?

Мой учитель и наставник С.Г.Петренко однажды сказал: "Если человек знает программирование - это хорошо, если человек знает - схемотехническую часть - это тоже хорошо, а если человек знает и то и другое, то это не в два раза лучше,а как минимум в десять!".

Теперь о том, что такое ассемблер. Ассемблер - это символьное выражение кодов команд процессора. То есть "железо" в "чистом виде". (Не путать с компиляторами ассемблера).

Внутренняя организация каждого из кристаллов (ATtiny15, ATmega8, ATmega 128 и т.д.) "своя". И отличие не только в обеме памяти или портов на кристалле, но и в наличие (отсутствие) различных таймеров-счетчиков, ADC преобразователей, I2C (TWI), JTAG интерфейса и т.д.

Без досканального изучения "состава" применяемого МК не обойтись!

А изучая состав, Вы, неминуемо, будете изучать регистры управления тем или иным устройством МК. И когда возникнет необходимость задать режим работы, скажем, ADC - вы вынуждены будете посмотреть какой командой можно записать требуемое значение в регистр управления. А это уже ассемблер.

Независимо от желания, любой пользователь "изучает" возможности управления МК на аппаратном уровне, читай - команды ассемблера.

Команды, в общем-то, любого процессора (микроконтроллера) не отличаются большим разнообразием. Можно выделить команды пересылки, с различными типами адресации, переходов - условных и безусловных, вызова подпрограмм, сложения и вычитания, логические - И, ИЛИ, ИСКЛ.ИЛИ, команды работы с битами, ну и команды работы со встроенными устройствами (SPI, ADC, USART..) и др.

Чего не скажешь о компиляторах Си. Мало того, что любой компилатор Си одладает полным запасом математических и др. функций, он еще позволяет делать ассемблерные вставки в Си'шный код.

Основной недостаток любого компилятора Си - это его избыточность. При вызове подпрограммы все используемые регистры "сохраняютя" в стеке. А это и процессорное время занимает, да и памяти под стек требует больше. Но не все так прохо... Представьте, что пишите программу на ASM и возникла необходимость разделить два целых 16-ти разрядных числа (int). Тогда придется писать ( или взять готовую, но в любом случае - добавить к программе) подпрограмму деления. Для этой подпрограммы выделить 4 , а лучше 6 регистров (РОН) - дилимое, делитель и частное. Программа будет использовать в своей работе еще несколько (видимо 4 , но можно уточнить точно) РОН для хранения промежуточных результатов. А значит придеться в программе предусмотреть сохранение в стеке используемых рагистров с последующим их восстановлением. То есть выигрыш от написания ТАКОЙ программы на ASM сомнителен.

Главное преимущество Си программ - это их переносимость. Если требуется "перенести" программу с одной платформы на другую (Atmel, PIC, Zilog, 51-я серия..), то не требуется знаний ASM каждой из систем. Хотя это касается только общих, не работающих с переферией, программ.

Главным же преимуществом ASM программ является возможность строгого "выдерживания" временнЫх ограничений (таймаутов). Но, во-первых, критичными по времени являются, как правило, лишь отдельные участки программы, а, во-вторых, "критичный" код можно оформить ввиде ассемблерной вставки в Си программу.

В любом компиляторе Си есть ограничение - обязательно наличие памяти (ОЗУ) под стек. То есть, если в кристалле нет ОЗУ (ATtiny15), то написать для него программу в Си компиляторе не получиться. (Для справки: в ATtiny15 для хнанения значений переменных используются 32 РОН и имеется 3-х уровневый. аппаратный стек)

Итог следующий:

1. Знать и уметь программировать на ASM - НЕОБХОДИМО.

2. Оптимальным вариантом применения ASM считаю - написание ассемблерных вставок в Си программу.

P.S. Очень рекомендую прочесть высказывания hww. Лучше не скажешь....

(C)STAS633

04.07.06г.

 

 

На главную

Hosted by uCoz