[an error occurred while processing this directive] [an error occurred while processing this directive]
О том, чего нельзя сделать на асме (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено просто так 18 сентября 2001 г. 18:46
В ответ на: Ответ: Вопрос к тем кто столь пространно и с удовольствием (для себя) рассуждает о преимуществах и премудростях С . Господа ,обьясните мне чего нельзя сделать на ASM ? это первое , а второе состоитв том что Вы в пылу отстаивания своих убеждений совсем забыли о вопросе с которым к ВАМ обратились отправлено Georg 18 сентября 2001 г. 17:42

Ну, во-первых, локальных переменных нельзя. Одно дело писать программку для управления миганием лампочки на елке, а другое дело - попытаться "влезть" в довольно небольшое ОЗУ процессора при создании сложной программы. Очень часто приходится использовать локальные переменные, причем различные функции могут использовать для временных переменных одни и те же адреса, а C-компилятор (или линкер) сам вычисляет необходимый размер сегмента для локальных переменных. Мне приходилось делать подобное на ассемблере - при большом количестве функций и большой вложенности функций очень трудно вычислить, какие ячейки памяти ты можешь в данной функции использовать, а какие - нет. При написании других функций или возрастании вложенности функций приходится заново все "пересматривать".

Второе - очень трудно быстро и качественно написать и отладить арифметику с плавающей точкой (хотя мне и это приходилось делать).

Третье - иногда требуются функции sin(), cos(), вычисление корня и возведение в степень - тоже задача не из легких (а учитывая трудности с использованием локальных переменных может потребоваться "лишние" байты в ОЗУ).

Четвертое - переносимость с одной плаформы на другую минимальная (а учитывая что придется переписывать и все библиотеки для плавающей арифметики, для функций sin(), cos() - дело очень затрудняется.

Пятое - есть функции sprintf и printf (хотя они много жрут памяти программ, так что я сам, программируя на C, часто использую свои функции) - этот пункт довольно проблематичен.

Шестое - присутствие адресной арифметики, указателей на функции и на переменные делает программирование более наглядным, чем то же, написанное на ассемблере (хотя на ассемблере конечно же это все довольно легко реализуется). Хотя здесь можно и поспорить :-)

Седьмое - допустим вы хотите сделать инкремент четырехбайтовой переменной. На C это будет выглядеть просто : i++
а на ассемблере придется после прибавления анализировать каждый байт на переполнение (на бит переноса) - очень легко сделать ошибку (даже не ошибку, а описку - я как-то вместо анализа байта по следующему адресу сделал анализ байта по тому же адресу - очень долго искал этот глюк).

Хотя вообще писать на C, не зная ассемблера конкретного кристалла я бы не рекомендовал - часто приходится лазить в листинги, чтобы посмотреть, как переводятся C-операторы в ассемблерные операторы, прикинуть время обработки (особенно в прерываниях).
И вообще - если у вас довольно простая задача и вы знаете ассемблер, а C знаете слабо, то конечно же надо писать на ассемблере - это даже экономически выгоднее и быстрее. Ну а если нужно использовать такие штуки, как плавающую арифметику, sin(), cos(), log(), возведение в степень и printf (особенно printf числа с плавающей точкой), то лучше изучить С и на нем написать - будет быстрее. Поэтому нужно оценивать сложность задачи и только тогда выбирать на чем писать.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru