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

 
 
> Как слепить 2 байта в int16
Eddy71
сообщение Jul 31 2009, 13:52
Сообщение #1


Местный
***

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



Возник глупейший вопрос из названия темы. Почти на ровном месте. Компилятор CCS PCW. Обработчик прерывания на асме, ловит по радио пакеты. В составе пакетов передается несколько двубайтовых чисел. После успешного приема у меня есть парочки вида
Код
int8 CntTXL,CntTXH;

Как мне без 8 сдвижек влево или без умножения CntTXH на 256 с прибавлением CntTXL получить
Код
int16 CntTX;
?


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jul 31 2009, 14:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Eddy71 @ Jul 31 2009, 17:52) *
Как мне без 8 сдвижек влево или без умножения

Чем "сдвижки" не устраивают? В реальности ведь компилятор 8 раз циклически сдвигать не станет, как, впрочем, и умножать в лоб на 256.
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Jul 31 2009, 14:15
Сообщение #3


Местный
***

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



Цитата(aaarrr @ Jul 31 2009, 17:08) *
Чем "сдвижки" не устраивают? В реальности ведь компилятор 8 раз циклически сдвигать не станет, как, впрочем, и умножать в лоб на 256.

Будет..
Пытаюсь вспомнить, когда-то как-то через union делал.. Тогда вообще без математики он понимает, что это 2-х байтовая переменная, отводит под двухбайтовое число те же байты в памяти, но чего-то в хэлпе найти не могу..


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 31 2009, 17:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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