|
Как слепить 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, 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
|
|
|
|
Сообщений в этой теме
Eddy71 Как слепить 2 байта в int16 Jul 31 2009, 13:52  aaarrr Цитата(Eddy71 @ Jul 31 2009, 18:15) Будет... Jul 31 2009, 14:19   Eddy71 Цитата(aaarrr @ Jul 31 2009, 17:19) Увере... Jul 31 2009, 14:42    aaarrr Цитата(Eddy71 @ Jul 31 2009, 18:42) Нашел... Jul 31 2009, 14:45     Сергей Борщ Цитата(aaarrr @ Jul 31 2009, 17:45) Ужас,... Aug 1 2009, 09:03      Eddy71 Цитата(Сергей Борщ @ Aug 1 2009, 12:03) Н... Aug 1 2009, 16:15       defunct Цитата(Eddy71 @ Aug 1 2009, 19:15) если г... Aug 2 2009, 23:57       _Pasha Цитата(Eddy71 @ Aug 1 2009, 19:15) Почему... Aug 3 2009, 05:52        Eddy71 Цитата(_Pasha @ Aug 3 2009, 08:52) По тем... Aug 3 2009, 09:41         zltigo Цитата(Eddy71 @ Aug 3 2009, 12:41) Каждый... Aug 3 2009, 09:51         SSerge Цитата(Eddy71 @ Aug 3 2009, 15:41) С комп... Aug 3 2009, 11:15          _Pasha Цитата(SSerge @ Aug 3 2009, 14:15) А кое-... Aug 3 2009, 11:43  defunct Цитата(Eddy71 @ Jul 31 2009, 17:15) Будет... Jul 31 2009, 15:07   AHTOXA Цитата(defunct @ Jul 31 2009, 21:07) Кодu... Jul 31 2009, 17:04    defunct Цитата(AHTOXA @ Jul 31 2009, 20:04) С ... Jul 31 2009, 17:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|