Определение младшего и старшего байта числа типа int. Нужна подсказка
14.06.2013, 19:06
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от AlexPi
|
А где же тот код который соответствует строке:
c=lli››56; // где этот код????????????????????????
его вы не привели.
|
Повторяю этот код:
Специально для непонятливых я привел ещё один листинг:
Попробуйте найти - чего в нём не хватает.
И в том, и в другом случае просто берутся соответствующие байты, а сдвигов - нет никаких, так как они не нужны.
Трудно поверить, что компилятор может быть умнее некоторых программистов? Тогда продолжайте гулять по своим граблям, кто ж запрещает-то...
__________________
There's always more than one way to skin a cat.
|
|
|
|
14.06.2013, 19:20
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
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 происходит загрузка количества сдвигов, а после вызов подпрограммы самого сдвига.
Дальнейшее дебаты считаю бесперспективной тратой времени.
|
|
|
|
14.06.2013, 19:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от AlexPi
|
|
Вот Вам мой результат
|
Вы просто не разбираетесь в предмете.
Сообщение от AlexPi
|
|
Дальнейшее дебаты считаю бесперспективной тратой времени.
|
Вот в этом - полностью согласен.  И с Вами, и с nahimovv'ым, который пришёл к тому же выводу ещё раньше.
__________________
There's always more than one way to skin a cat.
|
|
|
|
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
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от _Артём_
|
|
Компилятор (судя по фотографии) - IAR AVR.
|
Я вообще-то уже дважды автора просил указать че за такой супер компилятор у него, прям поверить трудно.
Он же только высокомерно язвит.
Может и IAR, говорят он действительно очень оптимальный ко дает, но те версии что нам попадались имели другие более серьезные проблемы. Вообщем пока не смени его на CV были одни глюки. Возможно если его приобрести то было бы все хорошо, но то уж не всем дано.
|
|
|
|
15.06.2013, 01:01
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
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
|
|
|
|
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
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
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
Куда симпатичнее предыдущих вариантов !
Рабочие переменные у меня локальные я это сделал специально, чтобы увидеть наиболее общий случай.
|
|
|
|
15.06.2013, 01:19
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от _Артём_
|
|
Компилятор, как компилятор. AVRGCC в данном случае примерно тоже самое сгенерит.
|
И чего же вы упрямые такие. Вон уже показал чего AVRGCC генерит, а Вы все свое ... .
Да, версия AVRGCC свежая скачивалась не более 2х месяцев назад.
Последний раз редактировалось AlexPi; 15.06.2013 в 01:22.
|
|
|
|
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-ами.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:04.
|
|