[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Ну, во-первых, локальных переменных нельзя. Одно дело писать программку для управления миганием лампочки на елке, а другое дело - попытаться "влезть" в довольно небольшое ОЗУ процессора при создании сложной программы. Очень часто приходится использовать локальные переменные, причем различные функции могут использовать для временных переменных одни и те же адреса, а C-компилятор (или линкер) сам вычисляет необходимый размер сегмента для локальных переменных. Мне приходилось делать подобное на ассемблере - при большом количестве функций и большой вложенности функций очень трудно вычислить, какие ячейки памяти ты можешь в данной функции использовать, а какие - нет. При написании других функций или возрастании вложенности функций приходится заново все "пересматривать".
Второе - очень трудно быстро и качественно написать и отладить арифметику с плавающей точкой (хотя мне и это приходилось делать).
Третье - иногда требуются функции sin(), cos(), вычисление корня и возведение в степень - тоже задача не из легких (а учитывая трудности с использованием локальных переменных может потребоваться "лишние" байты в ОЗУ).
Четвертое - переносимость с одной плаформы на другую минимальная (а учитывая что придется переписывать и все библиотеки для плавающей арифметики, для функций sin(), cos() - дело очень затрудняется.
Пятое - есть функции sprintf и printf (хотя они много жрут памяти программ, так что я сам, программируя на C, часто использую свои функции) - этот пункт довольно проблематичен.
Шестое - присутствие адресной арифметики, указателей на функции и на переменные делает программирование более наглядным, чем то же, написанное на ассемблере (хотя на ассемблере конечно же это все довольно легко реализуется). Хотя здесь можно и поспорить :-)
Седьмое - допустим вы хотите сделать инкремент четырехбайтовой переменной. На C это будет выглядеть просто : i++
а на ассемблере придется после прибавления анализировать каждый байт на переполнение (на бит переноса) - очень легко сделать ошибку (даже не ошибку, а описку - я как-то вместо анализа байта по следующему адресу сделал анализ байта по тому же адресу - очень долго искал этот глюк).
Хотя вообще писать на C, не зная ассемблера конкретного кристалла я бы не рекомендовал - часто приходится лазить в листинги, чтобы посмотреть, как переводятся C-операторы в ассемблерные операторы, прикинуть время обработки (особенно в прерываниях).
И вообще - если у вас довольно простая задача и вы знаете ассемблер, а C знаете слабо, то конечно же надо писать на ассемблере - это даже экономически выгоднее и быстрее. Ну а если нужно использовать такие штуки, как плавающую арифметику, sin(), cos(), log(), возведение в степень и printf (особенно printf числа с плавающей точкой), то лучше изучить С и на нем написать - будет быстрее. Поэтому нужно оценивать сложность задачи и только тогда выбирать на чем писать.
E-mail: info@telesys.ru