Гость Duvanoff 15 апреля, 2006 Опубликовано 15 апреля, 2006 · Жалоба Добрый день. Не могли бы растолковать как ИАР реализовывает битовые сдвиги. Интересует прежде всего аналоги команд ROL / ROR, т.е. не понятно как быть с битом "С" ? В "больших" Сях (например от микрософт) какой сдвиг реализовать компилятор выбирает из типа аргумента (unsigned/signed). А как здесь быть? Как написано в документации на 4.10 - <</>> делают только логический сдвиг (LSL/LSR). Как быть если нужен "зацикленный" сдвиг? Или может чего то я путаю? Заранее спасибо за разъяснения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 15 апреля, 2006 Опубликовано 15 апреля, 2006 · Жалоба Нет такой операции в Си. Вообще, Си ничего не знает про флаг переноса. Нужно вращение бит - делайте ассемблерную вставку/подпрограмму или пользуйтесь конструкцией вида 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 (арифметический). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Duvanoff 15 апреля, 2006 Опубликовано 15 апреля, 2006 · Жалоба Нет такой операции в Си. Вообще, Си ничего не знает про флаг переноса. Нужно вращение бит - делайте ассемблерную вставку/подпрограмму или пользуйтесь конструкцией вида ***** скип ***** Сдвиг вправо зависит от того, unsigned аргумент (логический сдвиг) или signed (арифметический). Спасибо за ответ. Очень жаль, что он ("СИ") этого не понимает 8-( .Т.е. соответственно команды типа ADC, SBC и подобные не реализовывает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DS 0 15 апреля, 2006 Опубликовано 15 апреля, 2006 · Жалоба "Внутри ", конечно, компилятор пользуется C-флагом, при сложениях-вычитаниях, многобайтовых сдвигах и т.д. Имелось в виду, что из Сишного кода нельзя напрямую достучаться до флага. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 17 апреля, 2006 Опубликовано 17 апреля, 2006 · Жалоба Ну вообщем, я набирался наглости на следующие вещи: #define _CARRY SREG_Bit0 void subrxcrc(unsigned int i) { i=rxcrc-i; if (_CARRY) i--; rxcrc=i; } Можно и со сдвигами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 17 апреля, 2006 Опубликовано 17 апреля, 2006 · Жалоба если надо кольцевой сдвиг на Си, то x = x>>n | x<<sizeof(x)*8-n это пример для сдвига вправо. где n - на сколько бит нужно сдвинуть, В зависимости от типа uC конечная реализация может оказаться как очень эффективной, так и наоборот, но работать будет всегда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 18 апреля, 2006 Опубликовано 18 апреля, 2006 · Жалоба Я использую флаг переноса таким макаром: //Засвечиваю сегмент A. Значение уровня равно флагу переноса Digit=Digit<<1; //Запрещаю прерывания, иначе возможно изменение флага переноса __disable_interrupt(); PORTD_Bit1=SREG&0x01; __enable_interrupt(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 18 апреля, 2006 Опубликовано 18 апреля, 2006 · Жалоба Igor26 предлагаю поправку - запрещать прерывания нужно до сдвига. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 18 апреля, 2006 Опубликовано 18 апреля, 2006 · Жалоба А вот и нифига. Не нужно запрещать прерывания, если у вас обработчик написан корректно (если писали сами на асме и не забыли сохранить SREG) или изготовлен самим компилятором (тот сохранит, если не глюканет ;)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 18 апреля, 2006 Опубликовано 18 апреля, 2006 · Жалоба А, ну да, верно :) запрещать незачем вообще. рефлексы сработали :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 19 апреля, 2006 Опубликовано 19 апреля, 2006 · Жалоба А вот и нифига. Не нужно запрещать прерывания, если у вас обработчик написан корректно (если писали сами на асме и не забыли сохранить SREG) или изготовлен самим компилятором (тот сохранит, если не глюканет ;)) Согласен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться