ArcherVZ 0 16 июня, 2009 Опубликовано 16 июня, 2009 (изменено) · Жалоба Доброго всем времени суток! Пишу программу под микроконтроллер HC908AP16 в среде Metrowerks CodeWarrior. Может, кто-н. сможет подсказать, как прочитать состояние бита переноса, не используя ассемблерную вставку? В Helpe на CodeWarrior есть указание на intrinsic function, но в какой библиотеке найти эту функцию? Если ближе к делу, то задача в следующем. Из беззнаковой переменной типа long вычитаю другую беззнаковую типа char. Требуется ограничить результат снизу нулем. Я, конечно, могу посмотреть на старший бит результата, но, наверное, правильнее было бы смотреть на флаг переноса. Изменено 16 июня, 2009 пользователем Василий Зыков Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Ваша проблема совершенно надуманная. Пускай undigned long a, result; unsigned char b; тогда if (a>(unsigned long)b) result=a-b; else result=0; либо это же можно записать еще короче result=(a>(unsigned long)b)?(a-b):0; Пардон! Проглядел, что вторая переменная у вас другого типа. Поправил с помощью явного приведения типов. При вычислении разности применяется неявное приведение типов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArcherVZ 0 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Спасибо! Ну а все же... меня раздирает интерес, раз в help'е есть упоминание такой функции, значит, она должна быть :) Изначально у меня в программе эти числа были знаковыми. Но во время испытаний я понял, что для меня это лишнее - и на текущий момент я выкрутился аналогичным способом. Только, поскольку числа по-прежнему объявлены, как знаковые, я просто смотрю - если меньше нуля, ограничиваю нулем. Если их сделать беззнаковыми, то я бы пошел предложенным Вами путем. Если бы не увидел мельком в helpe упомянутую функцию. Или я, все же, зря ищу эту функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Или я, все же, зря ищу эту функцию? ИМХО, не стоит. "Доступ" к carry - не тот случай, чтобы привлекать intrinsic, только программу изуродуете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArcherVZ 0 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Если Вы не против, я все-таки поинтересуюсь: я просто не каждый день программирую. И язык С изучал на коленке. По мере решения задач узнаю что-то новое. В чем уродство intrinsic? Чтобы я понимал, от чего я отказываюсь. Я почему-то думал, что intrinsic функция эквивалентна ассемблерной вставке, а, значит, код будет короче. Попробую сам догадаться... наверное, использование таких функций привязывает программу к конкретному компилятору? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба В чем уродство intrinsic?Ни в чем. Это функция, код которой генерится компилятором. Наподобие функций +, -, *, /, %. Поэтому ответ на ваш первый вопрос - эта функция не в библиотеках. Причем, в отличие от библиотечной функции, компилятор может вставлять различные варианты реализации этой функции в зависимости от исходных условий и оптимизировать тело такой функции. Уродство не в intrinsic, а в доступе к флагу переноса. Ведь никто не может гарантировать, что между операцией вычитания и вызовом этой функции компилятор не встравит какие-либо инструкции, влияющие на этот флаг. Попробую сам догадаться... наверное, использование таких функций привязывает программу к конкретному компилятору? И это тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Попробую сам догадаться... наверное, использование таких функций привязывает программу к конкретному компилятору?Недалеко от истины. В стандарте Си intrinsic-функции отсутствуют. Доступ к отдельным спец. битам/признакам зависит от конкретной архитектуры и поэтому в ЯВУ не специфицируется. Если вы хотите добиться какого-то специального результата, то напишите вашу функцию целиком на ASM и вызывайте ее из Си-шной программы. Только при этом следует учитывать особенности передачи параметров в/из функцию(и), характерные для данного конкретного компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArcherVZ 0 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Спасибо за ответы! Теперь мне все ясно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться