[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]

Отправлено BLACKEAGLE 21 мая 2002 г. 00:58
В ответ на: Народ! Кто нибудь работает с 8051 в ASMe? Вопрос проще некуда но ни как... отправлено v_k 20 мая 2002 г. 23:07

Во многих случаях вычисляемые ассемблером КОНСТАНТЫ подразумеваются целочисленными 16-битными. В качестве аргументов для вычислений на ходу можно использовать числа, укладывающиеся в 32 бита, но 32-битовые константы допускаются не во всех ассемблерах. К тому же нужно в явном виде задавать принудительный порядок вычислений, чтобы не потерять точность на внутренних округлениях.

Вот Ваш пример:

tic equ per*q/12000000, т.е. 2345*11059200/12000000, так?

Где так, а где и наоборот! Один ассемблер произведет действия слева направо, т.е. сначала умножит 2345 на 11059200, получив 25933824000, потом разделит 25933824000 на 12000000 и получит 2161.152, т.е. 2161 в целом виде. Другой пойдет справа - разделит 11059200 на 12000000, получив ПРИБЛИЗИТЕЛЬНО 0.921, затем умножит 0.921 на 2345 и получит уже 2160 вместо 2161, т.е. ошибется на единичку. Эти вещи - порядок вычисления в выражениях и допустимые пределы членов выражений/констант всегда оговариваются в документации соответствующих ассемблеров.

Зачастую этот бардак можно еще и усугубить, при попытке использования промежуточных констант - ведь они в некоторых ассемблерах могут быть только целыми, и за этим нужно внимательно следить. В некоторых случаях помогают скобки, принудительно задающие порядок вычислений - например, могут быть разные результаты от 2345*(11059200/12000000) и (2345*11059200)/12000000. Не нужно забывать и о том, что числа в диапазоне от 2^30 до 2 ^31 могут быть некорректно истолкованы как отрицательные - с подобным глюком приходилось сталкиваться достаточно часто.


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

Ответы



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

E-mail: info@telesys.ru