Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Определение младшего и старшего байта числа типа int. Нужна подсказка

Непрочитано 14.06.2013, 19:06  
tempora
Почётный гражданин KAZUS.RUN
 
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
А где же тот код который соответствует строке:
c=lli››56; // где этот код????????????????????????
его вы не привели.
Повторяю этот код:

Специально для непонятливых я привел ещё один листинг:

Попробуйте найти - чего в нём не хватает.

И в том, и в другом случае просто берутся соответствующие байты, а сдвигов - нет никаких, так как они не нужны.
Трудно поверить, что компилятор может быть умнее некоторых программистов? Тогда продолжайте гулять по своим граблям, кто ж запрещает-то...
Реклама:
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 14.06.2013, 19:20  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от tempora Посмотреть сообщение
И в том, и в другом случае просто берутся соответствующие байты, а сдвигов - нет никаких, так как они не нужны.
Трудно поверить, что компилятор может быть умнее некоторых программистов? Тогда продолжайте гулять по своим граблям, кто ж запрещает-то...
Какой у Вас компилятор? К тому же оптимизация не всегда так Вам отработает.
И вообще приведите кусок .lst файла ,а не скриншот непонятно чего, там четко и конкретно видно что из чего получается.
Вот Вам мой результат специально для крутых программистов с умным компилятором:

; 0000 037A i=A››24;// Проверяем Сдвиг !!!!!
+
00041d 01de +MOVW R26 , R28
00041e 5aa8 +SUBI R26 , LOW ( - 88 )
00041f 4fbf +SBCI R27 , HIGH ( - 88 )
000420 900d +LD R0 , X +
000421 901d +LD R1 , X +
000422 918d +LD R24 , X +
000423 919c +LD R25 , X
000424 01d0 +MOVW R26 , R0
__GETD2SX 88
000425 e1e8 LDI R30,LOW(24)
000426 940e 0c50 CALL __LSRD12
000428 2f1e MOV R17,R30

а во что из себя представляет __LSRD12 :

__LSRD12:
000c50 23ee TST R30
000c51 2e0e MOV R0,R30
000c52 01fd MOVW R30,R26
000c53 01bc MOVW R22,R24
000c54 f031 BREQ __LSRD12R
__LSRD12L:
000c55 9576 LSR R23
000c56 9567 ROR R22
000c57 95f7 ROR R31
000c58 95e7 ROR R30
000c59 940a DEC R0
000c5a f7d1 BRNE __LSRD12L
__LSRD12R:
000c5b 9508 RET

Вот там четко видно как в регист R30 происходит загрузка количества сдвигов, а после вызов подпрограммы самого сдвига.
Дальнейшее дебаты считаю бесперспективной тратой времени.
AlexPi вне форума  
Непрочитано 14.06.2013, 19:34  
tempora
Почётный гражданин KAZUS.RUN
 
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Вот Вам мой результат
Вы просто не разбираетесь в предмете.

Сообщение от AlexPi Посмотреть сообщение
Дальнейшее дебаты считаю бесперспективной тратой времени.
Вот в этом - полностью согласен. И с Вами, и с nahimovv'ым, который пришёл к тому же выводу ещё раньше.
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 14.06.2013, 19:52  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Какой у Вас компилятор?
Компилятор (судя по фотографии) - IAR AVR.
Сообщение от AlexPi Посмотреть сообщение
К тому же оптимизация не всегда так Вам отработает.
Если сдвиг кратен 8, то отработает.

Сообщение от AlexPi Посмотреть сообщение
а не скриншот непонятно чего, там четко и конкретно видно что из чего получается.
Скриншот "понятно чего" - экран симулятора (дизассемблер).

Сообщение от AlexPi Посмотреть сообщение
Вот Вам мой результат специально для крутых программистов с умным компилятором:

; 0000 037A i=A››24;// Проверяем Сдвиг !!!!!
+
00041d 01de +MOVW R26 , R28
00041e 5aa8 +SUBI R26 , LOW ( - 88 )
00041f 4fbf +SBCI R27 , HIGH ( - 88 )
000420 900d +LD R0 , X +
000421 901d +LD R1 , X +
000422 918d +LD R24 , X +
000423 919c +LD R25 , X
000424 01d0 +MOVW R26 , R0
__GETD2SX 88
000425 e1e8 LDI R30,LOW(24)
000426 940e 0c50 CALL __LSRD12
000428 2f1e MOV R17,R30

а во что из себя представляет __LSRD12 :

__LSRD12:
000c50 23ee TST R30
000c51 2e0e MOV R0,R30
000c52 01fd MOVW R30,R26
000c53 01bc MOVW R22,R24
000c54 f031 BREQ __LSRD12R
__LSRD12L:
000c55 9576 LSR R23
000c56 9567 ROR R22
000c57 95f7 ROR R31
000c58 95e7 ROR R30
000c59 940a DEC R0
000c5a f7d1 BRNE __LSRD12L
__LSRD12R:
000c5b 9508 RET

Вот там четко видно как в регист R30 происходит загрузка количества сдвигов, а после вызов подпрограммы самого сдвига.
Это что за тулза такой код выдала? Codevision? Imagecraft?
Озвучте что ли.

Последний раз редактировалось _Артём_; 14.06.2013 в 19:56.
_Артём_ вне форума  
Непрочитано 15.06.2013, 00:35  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от _Артём_ Посмотреть сообщение
Компилятор (судя по фотографии) - IAR AVR.
Я вообще-то уже дважды автора просил указать че за такой супер компилятор у него, прям поверить трудно.
Он же только высокомерно язвит.

Может и IAR, говорят он действительно очень оптимальный ко дает, но те версии что нам попадались имели другие более серьезные проблемы. Вообщем пока не смени его на CV были одни глюки. Возможно если его приобрести то было бы все хорошо, но то уж не всем дано.
AlexPi вне форума  
Непрочитано 15.06.2013, 01:01  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от _Артём_ Посмотреть сообщение
Это что за тулза такой код выдала? Codevision? Imagecraft?
Вот сразу видно специалиста. С Вами таки можно вести диалог.
Да это Codevision. Но ничего ужасного я тут не вижу. Об IAR я уже сказал.
Но это еще классный код по сравнению с тем что может GCC сотворить.
Поверите на слово или пример приводить?
Да чего уж там конечно же не поверите вот Вам код от GCC уже для long long:

i = A››56; // Проверка сдвига !!!!!!!!!!!
ae: 2a 81 ldd r18, Y+2 ; 0x02
b0: 3b 81 ldd r19, Y+3 ; 0x03
b2: 4c 81 ldd r20, Y+4 ; 0x04
b4: 5d 81 ldd r21, Y+5 ; 0x05
b6: 6e 81 ldd r22, Y+6 ; 0x06
b8: 7f 81 ldd r23, Y+7 ; 0x07
ba: 88 85 ldd r24, Y+8 ; 0x08
bc: 99 85 ldd r25, Y+9 ; 0x09
be: 08 e3 ldi r16, 0x38 ; 56
c0: 0e 94 77 00 call 0xee ; 0xee ‹__ashrdi3›
c4: a2 2e mov r10, r18
c6: b3 2e mov r11, r19
c8: c4 2e mov r12, r20
ca: d5 2e mov r13, r21
cc: e6 2e mov r14, r22
ce: f7 2e mov r15, r23
d0: 08 2f mov r16, r24
d2: 19 2f mov r17, r25
d4: 2a 2d mov r18, r10
d6: 3b 2d mov r19, r11
d8: 4c 2d mov r20, r12
da: 5d 2d mov r21, r13
dc: 6e 2d mov r22, r14
de: 7f 2d mov r23, r15
e0: 80 2f mov r24, r16
e2: 91 2f mov r25, r17
e4: 29 83 std Y+1, r18 ; 0x01

Заметьте, снова имеем схожую конструкцию:
be: 08 e3 ldi r16, 0x38 ; 56
c0: 0e 94 77 00 call 0xee ; 0xee ‹__ashrdi3›
т.е. загрузили к-во сдвигов и вызвали подпрограмму сдвига

Подпрограмму сдвига (0xee ‹__ashrdi3›) приводить не буду, она раз в 10 длиннее того что CV нагенерил. Можете установить, если нет, WinAVR и проверить сами. После компиляции сморите результат в файле *.lss
AlexPi вне форума  
Непрочитано 15.06.2013, 01:03  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
че за такой супер компилятор у него, прям поверить трудно.
Компилятор, как компилятор. AVRGCC в данном случае примерно тоже самое сгенерит.


Сообщение от AlexPi Посмотреть сообщение
но те версии что нам попадались имели другие более серьезные проблемы.
Это 10-15 лет назад чтоли? Давно уже ни с IAR-ом, ни с AVRGCC особых проблем нет.

Сообщение от AlexPi Посмотреть сообщение
Вообщем пока не смени его на CV были одни глюки.
CodeVision во всей красе...И это с включённой оптимизацией?

Сообщение от AlexPi Посмотреть сообщение
Возможно если его приобрести то было бы все хорошо
Скажу по-секрету: даже если IAR не покупать, он всё равно нормально работает (последние лет 10 точно).

Но если лицензионность - вопрос принципа, то остаётся AVRGC.
_Артём_ вне форума  
Непрочитано 15.06.2013, 01:16  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Ну и пожалуй в заключении то что нагенерил GCC с использованием union:

un1.A=A;
ae: 8a 81 ldd r24, Y+2 ; 0x02
b0: 80 93 60 00 sts 0x0060, r24
b4: 8b 81 ldd r24, Y+3 ; 0x03
b6: 80 93 61 00 sts 0x0061, r24
ba: 8c 81 ldd r24, Y+4 ; 0x04
bc: 80 93 62 00 sts 0x0062, r24
c0: 8d 81 ldd r24, Y+5 ; 0x05
c2: 80 93 63 00 sts 0x0063, r24
c6: 8e 81 ldd r24, Y+6 ; 0x06
c8: 80 93 64 00 sts 0x0064, r24
cc: 8f 81 ldd r24, Y+7 ; 0x07
ce: 80 93 65 00 sts 0x0065, r24
d2: 88 85 ldd r24, Y+8 ; 0x08
d4: 80 93 66 00 sts 0x0066, r24
d8: 89 85 ldd r24, Y+9 ; 0x09
da: 80 93 67 00 sts 0x0067, r24
i = un1.B[7] ; // Проверка UNION !!!!!!!!!!!
de: 80 91 67 00 lds r24, 0x0067
e2: 89 83 std Y+1, r24 ; 0x01

Куда симпатичнее предыдущих вариантов !
Рабочие переменные у меня локальные я это сделал специально, чтобы увидеть наиболее общий случай.
AlexPi вне форума  
Непрочитано 15.06.2013, 01:19  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от _Артём_ Посмотреть сообщение
Компилятор, как компилятор. AVRGCC в данном случае примерно тоже самое сгенерит.
И чего же вы упрямые такие. Вон уже показал чего AVRGCC генерит, а Вы все свое ... .
Да, версия AVRGCC свежая скачивалась не более 2х месяцев назад.

Последний раз редактировалось AlexPi; 15.06.2013 в 01:22.
AlexPi вне форума  
Непрочитано 15.06.2013, 01:40  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
И чего же вы упрямые такие.
Не успел прочитать ещё. Мой пост между вашими влез.

Сообщение от AlexPi Посмотреть сообщение
Вон уже показал чего AVRGCC генерит
Сгенерённое зависит от настроек оптимизации.

P.S.
Да, с long long не очень
Код:
+0000013A:   B990        OUT       0x00,R25       Out to I/O location
35:       		unsigned long long port_state=GetPORTS();
+0000013B:   940E04C6    CALL      0x000004C6     Call subroutine
+0000013D:   014B        MOVW      R8,R22         Copy register pair
+0000013E:   015C        MOVW      R10,R24        Copy register pair
36:       		GPIOR1=(port_state››56)&255;
+0000013F:   B811        OUT       0x01,R1        Out to I/O location
37:       		GPIOR2=(port_state››48)&255;
+00000140:   B812        OUT       0x02,R1        Out to I/O location
38:       		GPIOR3=(port_state››40)&255;
+00000141:   B813        OUT       0x03,R1        Out to I/O location
39:       		GPIOR4=(port_state››32)&255;
+00000142:   B814        OUT       0x04,R1        Out to I/O location
40:       		GPIOR5=(port_state››24)&255;
а вто дальше совсем плохо (на каждый байт тактов по 600):
Код:
40:       		GPIOR5=(port_state››24)&255;
+00000143:   019B        MOVW      R18,R22        Copy register pair
+00000144:   01A5        MOVW      R20,R10        Copy register pair
+00000145:   E060        LDI       R22,0x00       Load immediate
+00000146:   E070        LDI       R23,0x00       Load immediate
+00000147:   E080        LDI       R24,0x00       Load immediate
+00000148:   E090        LDI       R25,0x00       Load immediate
+00000149:   E108        LDI       R16,0x18       Load immediate
+0000014A:   940E0502    CALL      0x00000502     Call subroutine
+0000014C:   B925        OUT       0x05,R18       Out to I/O location
41:       		GPIOR6=(port_state››16)&255;
Вывод: в таких случаях нужно указателями или другими способами работать. Или не напрягать 8bit МК 64битными int-ами.
_Артём_ вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение типа симистора maks191 Информация по радиокомпонентам 5 09.12.2012 23:15
Научите int в два байта и наоборот? ) whoim Электроника - это просто 4 13.08.2012 21:56
Как 4 байта, принятых по USART превратить в число формата long int Black Jack Микроконтроллеры, АЦП, память и т.д 2 06.06.2012 21:32
Определение типа усилителя JeckVi Электроника - это просто 16 22.02.2010 17:49
Программное определение типа EEPROM Jendoss Микроконтроллеры, АЦП, память и т.д 3 24.03.2009 18:44


Часовой пояс GMT +4, время: 20:04.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.