|
Как слепить 2 байта в int16 |
|
|
|
Jul 31 2009, 13:52
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Возник глупейший вопрос из названия темы. Почти на ровном месте. Компилятор CCS PCW. Обработчик прерывания на асме, ловит по радио пакеты. В составе пакетов передается несколько двубайтовых чисел. После успешного приема у меня есть парочки вида Код int8 CntTXL,CntTXH; Как мне без 8 сдвижек влево или без умножения CntTXH на 256 с прибавлением CntTXL получить Код int16 CntTX; ?
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Jul 31 2009, 14:15
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Цитата(aaarrr @ Jul 31 2009, 17:08)  Чем "сдвижки" не устраивают? В реальности ведь компилятор 8 раз циклически сдвигать не станет, как, впрочем, и умножать в лоб на 256. Будет.. Пытаюсь вспомнить, когда-то как-то через union делал.. Тогда вообще без математики он понимает, что это 2-х байтовая переменная, отводит под двухбайтовое число те же байты в памяти, но чего-то в хэлпе найти не могу..
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Jul 31 2009, 14:19
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Eddy71 @ Jul 31 2009, 18:15)  Будет.. Уверены? Тогда меняйте компилятор, ибо если здесь наблюдается такой маразм, то дальше ловить нечего. Цитата(Eddy71 @ Jul 31 2009, 18:15)  Пытаюсь вспомнить, когда-то как-то через union делал.. Тогда вообще без математики он понимает, что это 2-х байтовая переменная, отводит под двухбайтовое число те же байты в памяти, но чего-то в хэлпе найти не могу.. Дык это не в хелпе, а в книжке по 'C' искать надо.
|
|
|
|
|
Jul 31 2009, 14:42
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Цитата(aaarrr @ Jul 31 2009, 17:19)  Уверены? Тогда меняйте компилятор, ибо если здесь наблюдается такой маразм, то дальше ловить нечего. Дык это не в хелпе, а в книжке по 'C' искать надо. Нашел. Всё очень просто оказалось: Код CntTX = make16(CntTXh,CntTXh);
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Jul 31 2009, 17:00
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Eddy71 @ Jul 31 2009, 17:15)  Будет.. Код 2196 xt = GetChar(); // Загрузить SizeX мл.байт \ 000003D8 .... RCALL GetChar \ 000003DA 2E60 MOV R6, R16 2197 if(Flag.ErrLoadKom) continue; // Если обнаружена ошибка загрузки команды, то перейти к загрузке следующей \ 000003DC .... LDI R30, LOW(AdrProgEnd) \ 000003DE .... LDI R31, (AdrProgEnd) >> 8 \ 000003E0 8D01 LDD R16, Z+25 \ 000003E2 FD00 SBRC R16, 0 \ 000003E4 CF2C RJMP ??main_8 2198 *TekAdrActive++ = xt; \ 000003E6 01FD MOVW R31:R30, R27:R26 \ 000003E8 A900 LDD R16, Z+48 \ 000003EA A9F1 LDD R31, Z+49 \ 000003EC 2FE0 MOV R30, R16 \ 000003EE 8260 ST Z, R6 \ 000003F0 01FD MOVW R31:R30, R27:R26 \ 000003F2 A900 LDD R16, Z+48 \ 000003F4 A911 LDD R17, Z+49 \ 000003F6 5F0F SUBI R16, 255 \ 000003F8 4F1F SBCI R17, 255 \ 000003FA AB00 STD Z+48, R16 \ 000003FC AB11 STD Z+49, R17 2199 xt |= (GetChar())<<8; // Загрузить SizeX ст.байт \ 000003FE .... RCALL GetChar \ 00000400 2E70 MOV R7, R16 Привёл большой кусок, ничего не выкидывая, чтобы вам яснее видно была работа компилятора. И уровень, с каким он делает оптимизацию. Обратите внимание на строку "xt = GetChar();". Учитывая что "xt" 16 бит, то компилятор должен был занести в R6 результат работы п/п, а в R7 - 0 (Из листинга видно, что r6:r7 это xt). Но он этого не делает, в связи с тем, что ниже по тексту видит строку "xt |= (GetChar())<<8;". И он компилирует это в "MOV R7, R16". То есть компилятор не только не делает сдвигов, но даже упрощает саму операцию. Я, когда писал, ожидал от него увидеть следующее: xt = GetChar(); xt |= (GetChar())<<8; ... mov r6,r16 ldi r16,0 mov r7,r16 ... or r7,r16 А получил в результате ... mov r6,r16 ... mov r7,r16
|
|
|
|
|
Aug 3 2009, 09:41
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Цитата(_Pasha @ Aug 3 2009, 08:52)  По теме. SDCC Охwенный минус - нету поддержки dspic, и простеньких пиков. Зато остальное(pic18) - полет нормальный. Политические войны на тему "что лучше" раньше в Фидо карались до отключения на год.. С компилятором оно как с женщиной: одному нравится, чтоб была как балерина невесомая, другому что можно было "..а я в тебя как в море..", кому-то французская изысканность, а кому то и немецкий "..дасис фантастиш!" Каждый прав по своему.
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|