реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Keil preprocessor аля MACRO в assembler, Как возвести в степень на стадии компиляции
AndreyS
сообщение Dec 24 2007, 14:51
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Добрый день всем.

Меня интересует вопрос и очень давно.
Как в Си Keil с помощью команд препроцессора произвести некое вычисление с количеством итираций болшее 1.

Например раньше в асме у меня это не вызывало проблем через директиву SET.
В Си не нашел (может плохо искал). Но на #define SS SS+2 компилятор ругается. В целом варнинги не напрягают. А напрягает их количество, если я делаю такое большое число раз.

Подскажите плиз, как на стадии компиляции мне высичлить константу???

Например это нужно для вычисления значения 2^x

Спасибо.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 24 2007, 16:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата
на #define SS SS+2 компилятор ругается.


Странная конструкция... Вы что хотели то определить?

Цитата
Например это нужно для вычисления значения 2^x


Например, так

#define E2(X) (1 << (X))
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Dec 24 2007, 19:06
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Цитата(Палыч @ Dec 24 2007, 19:04) *
Странная конструкция... Вы что хотели то определить?
Например, так

#define E2(X) (1 << (X))



Спасибо.

Вы задали вектор моим размышлениям smile.gif

А конструкцией я пытался реализовать следующее ss+=2;


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 25 2007, 07:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(AndreyS @ Dec 24 2007, 22:06) *
А конструкцией я пытался реализовать следующее ss+=2;
В ассемблере есть (обычно) директива SET и директива EQU - препроцессорный define, скорее, аналог последней: вместо определенного в define идентификатора подставляется его значение в текст программы. Первые препроцессоры были совершенно отделены от транслятора, и тупо подставляли в тексте программы вместо одной последовательности символов другую, ничего не зная о значениях этих символов. Сейчас, хотя препроцессор и интегрирован с транслятором, но "нарастить" значения идентификаторов попрежнему не может. Впрочем, нужно ли это? Я себе не представляю программу, в которой это пригодилось бы.
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Dec 25 2007, 13:37
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Добрый день

Цитата
Сейчас, хотя препроцессор и интегрирован с транслятором, но "нарастить" значения идентификаторов попрежнему не может. Впрочем, нужно ли это? Я себе не представляю программу, в которой это пригодилось бы.


По поводу увеличивающихся по значению идентификаторов.

Вот пример (в асме он используется всегда):

Код
    LABEL    SET    0
START_TIMER_TIME_OUT    MACRO COUNTER,LABEL_NUM
    COUNTER    SET    COUNTER+1

    JB TR2,SUF&LABEL_NUM
    MOV TMR2L,#LOW(TIME_MINIMUM)       ; Мин. промежуток времени для задержки по IIC шине (для EEPROM и термодатчиков)
    MOV TMR2H,#HIGH(TIME_MINIMUM)
SUF&LABEL_NUM:
    SETB TR2                                  ; Запускаем отсчет времени
    ENDM


Вызоа макроса

Код
    START_TIMER_TIME_OUT LABEL,%LABEL        ; Запускаем таймер


Может быть пример неудачный. Но использование макросов с проверкой оправдано когда критичны потери времени на вход и выход в/из процедуры.

Удачи.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 25 2007, 15:25
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(AndreyS @ Dec 25 2007, 16:37) *
По поводу увеличивающихся по значению идентификаторов. Вот пример ...
Может быть пример неудачный. Но использование макросов с проверкой оправдано когда критичны потери времени на вход и выход в/из процедуры.
Ну, с ассемблером - там всё ясно. Речь шла о языке С.
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Dec 25 2007, 20:16
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Цитата(Палыч @ Dec 25 2007, 18:25) *
Ну, с ассемблером - там всё ясно. Речь шла о языке С.



А ну я подошел к своей проблеме топорно.
На основании опыта с асмом, решил реализовать 2^x как макроопределения.
Ваш вариант наставил на путь истинный smile.gif

После асма мне еще тяжело перейти к дефайнам. Меня интересовал вопрос, чтобы после работы препроцессора полученное значение было подставлено в код, а не вся формула. А до сдвига константы на константу я не дошел smile.gif

Спасибо.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 10:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016