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

 
 
> Реализация битовых сдвигов в IAR C
Duvanoff
сообщение Apr 15 2006, 08:51
Сообщение #1





Группа: Validating
Сообщений: 2
Регистрация: 15-04-06
Пользователь №: 16 139



Добрый день.
Не могли бы растолковать как ИАР реализовывает битовые сдвиги. Интересует прежде всего аналоги команд ROL / ROR, т.е. не понятно как быть с битом "С" ? В "больших" Сях (например от микрософт) какой сдвиг реализовать компилятор выбирает из типа аргумента (unsigned/signed). А как здесь быть? Как написано в документации на 4.10 - <</>> делают только логический сдвиг (LSL/LSR). Как быть если нужен "зацикленный" сдвиг? Или может чего то я путаю?
Заранее спасибо за разъяснения.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
vet
сообщение Apr 15 2006, 10:25
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Нет такой операции в Си.
Вообще, Си ничего не знает про флаг переноса.
Нужно вращение бит - делайте ассемблерную вставку/подпрограмму или пользуйтесь конструкцией вида
Код
unsigned char n;
//вращение байта вправо
if (n&1) n = (n>>1)|0x80; else n >>= 1;
//вращение байта влево
if (n&0x80) n = (n<<1)|0x01; else n <<= 1;


Сдвиг вправо зависит от того, unsigned аргумент (логический сдвиг) или signed (арифметический).


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Duvanoff
сообщение Apr 15 2006, 13:39
Сообщение #3





Группа: Validating
Сообщений: 2
Регистрация: 15-04-06
Пользователь №: 16 139



Цитата(vet @ Apr 15 2006, 14:25) *
Нет такой операции в Си.
Вообще, Си ничего не знает про флаг переноса.
Нужно вращение бит - делайте ассемблерную вставку/подпрограмму или пользуйтесь конструкцией вида
***** скип *****

Сдвиг вправо зависит от того, unsigned аргумент (логический сдвиг) или signed (арифметический).


Спасибо за ответ.

Очень жаль, что он ("СИ") этого не понимает 8-( .Т.е. соответственно команды типа ADC, SBC и подобные не реализовывает?
Go to the top of the page
 
+Quote Post
DS
сообщение Apr 15 2006, 13:50
Сообщение #4


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



"Внутри ", конечно, компилятор пользуется C-флагом, при сложениях-вычитаниях, многобайтовых сдвигах и т.д. Имелось в виду, что из Сишного кода нельзя напрямую достучаться до флага.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 17 2006, 05:18
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Ну вообщем, я набирался наглости на следующие вещи:

Код
#define _CARRY SREG_Bit0

void subrxcrc(unsigned int i)
{
i=rxcrc-i;
if (_CARRY) i--;
rxcrc=i;
}


Можно и со сдвигами...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 17 2006, 06:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



если надо кольцевой сдвиг на Си, то x = x>>n | x<<sizeof(x)*8-n это пример для сдвига вправо.
где
n - на сколько бит нужно сдвинуть,
В зависимости от типа uC конечная реализация может оказаться как очень эффективной, так и наоборот, но работать будет всегда.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Igor26
сообщение Apr 18 2006, 05:54
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Я использую флаг переноса таким макаром:

//Засвечиваю сегмент A. Значение уровня равно флагу переноса
Digit=Digit<<1;
//Запрещаю прерывания, иначе возможно изменение флага переноса
__disable_interrupt();
PORTD_Bit1=SREG&0x01;
__enable_interrupt();
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 18 2006, 06:15
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Igor26
предлагаю поправку - запрещать прерывания нужно до сдвига.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 18 2006, 09:18
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



А вот и нифига. Не нужно запрещать прерывания, если у вас обработчик написан корректно (если писали сами на асме и не забыли сохранить SREG) или изготовлен самим компилятором (тот сохранит, если не глюканет wink.gif)


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 18 2006, 09:20
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



А, ну да, верно smile.gif запрещать незачем вообще.
рефлексы сработали smile.gif


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Igor26
сообщение Apr 19 2006, 06:30
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(Rst7 @ Apr 18 2006, 13:18) *
А вот и нифига. Не нужно запрещать прерывания, если у вас обработчик написан корректно (если писали сами на асме и не забыли сохранить SREG) или изготовлен самим компилятором (тот сохранит, если не глюканет wink.gif)

Согласен
Go to the top of the page
 
+Quote Post

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

 


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


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