MBedder, терминатор (28.02.2011 22:23 - 22:54, просмотров: 383) ответил mazur на Есть битовое поле. Скажем, 24 бита, то есть, 3 байта. И нужно проверить определенный бит. Когда писал проверочный код, это получилось 24 функции, которые отличались только номерами битов. Попытался возложить эту функцию микроконтроллеру.
Будь проще, и к тебе потянутся люди :) Фтыкай и учись - 2 слова/3 такта вместо всего твоего монстрика, да еще и бит-массив любой длины, кратной 8
;-----------------------------------------------------------------------------------------------
; Tests a bit #0..N-1 in an N-bit array (N must be a multiple of 8 - 8,16,24,32,40 etc.).
; Trashes R16 - save/restore it if needed.
;
.macro btest
lds r16,@0+@1/8 ; Read an (N/8)th byte of a bit array depending on bit #
andi r16,1<<(@1%8) ; Mask out irrelevant bits, set zero flag if bit #@1 is 0
.endm
;-----------------------------------------------------------------------------------------------
.dseg
bits: .byte 296/8 ; Sample 296-bit array (little endian)
.cseg
.equ foobit = 179 ; Bit # to be tested (0..N-1 range)
btest bits,foobit ; Perform a bit test
brne foobit_is_1 ; Branch if bit is set
; foobit_is_0:
; Process FOOBIT = 0 state
rjmp continue ; Go ahead with code
foobit_is_1:
; Process FOOBIT = 1 state
continue:
; Proceed
-
- можно про операнд % ? - mazur(01.03.2011 01:22)
- И таких 24 штуки для задаваемого бита? Тогда в чем радость? - Barinov(28.02.2011 23:17, )
- Еще один умник :)) ОДНА (1) штука для любого бита - одна на всех, соколик :) - MBedder(28.02.2011 23:19)
- Соколик, твое макро делает сдвиг на жестко задаваемой позицию бита. Для другой позиции искомого бита будет другое макро. Итого 24. От чего афтор и уйти хочет. - Barinov(28.02.2011 23:24, )
- Если бы ты хоть чуток понимал в ассемблере, то увидел бы, что "моё макро" ничего никуда не сдвигает. Ступай, соколик - MBedder(01.03.2011 01:23)
- Не 24 а один этот макрос, а номер бита идёт вторым параметром макроса (константой). Посмотрите внимательней. - leon_(28.02.2011 23:37)MBedder
- Вот именно, задается константой. И кодовая реализация будет для каждого бита разная. И для всего набора анализируемых бит должен быть полный набор реализации макросов, от чего автор собственно и хочет уйти. Вот я и спрашиваю, в чем радость? - Barinov(01.03.2011 08:45, )
- Радость в том, что оптимизируется либо размер либо скорость, в данном случае скорость. Топикастер хочет знать как это делать ВААЩЕ - результат налицо. - Xитpый Kитaeц(01.03.2011 11:58)
- Кстати, соколик уже понял это, и запел про "легко модифицировать", а вначале пел про 3 такта "вместо всего твого монстрика":))) - Barinov(01.03.2011 08:48, )
- Ты обтекай поаккуратнее, а то брызги летят :)) - MBedder(01.03.2011 19:21)
- Он прав если че... Смешны скорее Вы со своими 3 тактами. Надо читать тему. - IvanKo(01.03.2011 20:13, )
- Если чё, то в теме написано: "Есть битовое поле. Скажем, 24 бита, то есть, 3 байта. И нужно проверить определенный [= заранее известно какой] бит" - что мой двухсловный макрос именно и делает. MBedder(466 знак., 01.03.2011 21:06)
- Если че, то там в теме написано, что он сделал 24 функции которые отличались только номерами бит, и это ему не нравится. Вы ему предлагаете генератор тех же 24-х реализаций и уверяете что на все про все 3 такта. Где логика? - Barinov(01.03.2011 22:16, )
- Я ему предлагаю не генератор, а суперкомпактный автоматический инлайн-реализатор тех функций. А тебе предлагаю оставить содержимое твоего горшка в покое, и больше им не плеваться - MBedder(01.03.2011 23:41)
- Вы предложили расхожий вариант для генерации своего куска кода для анализа каждого бита. Автор подтвердил, что хотел не этого. В чем проблемма признаться что Вы не прав? - Barinov(03.03.2011 08:39, )
- Вы уже столько написали... Не проще было скопипастить макрос, пару раз его вызвать да посмотреть дизассемблером, что получится? Лень? Так я Вам скажу: на каждый вызов будут подставлены те два оператора с правильными аргументами. - maik-vs(03.03.2011 10:22)
- Друг, ты не меньше понаписал, пора понять, что Мазуру нужен ззадаваемый номер бита, а ему дали метод обращения к константнозадаваемому биту. Вот попробуй напиши цикл опроса всех бит, и увидишь что это не 3 такта. Нужна подпрограммка, говорю же, а BorisSh(10 знак., 03.03.2011 15:15, )
- Где я понаписал? А Мазуру нужно переходить на Си с его любовью к монструозным конструкциям. Ладно, maik-vs(333 знак., 03.03.2011 15:56)
- Ни за что не поверю, что ваши программы с первого раза безупречны. - mazur(04.03.2011 22:36 - 05.03.2011 11:37)
- Вот полученная мною подпрограмма. Напишите ее короче. - mazur(03.03.2011 20:21, ссылка)
- Думаю, оптимальнее уже не сделать. mazur(614 знак., 04.03.2011 21:48)
- Вот код, который покороче будет: 580BM80(895 знак., 04.03.2011 07:27 - 07:30)
- "Не корысти ради"(с) - еще чуток покороче и побыстрее :)) MBedder(802 знак., 04.03.2011 12:26 - 25.03.2011 03:21)
- Не думал, что эту тему снова поднимут. Раз так, спрошу, откуда взялась цифра именно 32? Я не спрашиваю, для чего, спрашиваю-откуда? - mazur(25.03.2011 06:51)
- За mul респект! Бум знать. - maik-vs(05.03.2011 12:53)
- Только справедливости ради :) И быстрее и универсальней, но не короче. - 580BM80(04.03.2011 13:39)
- Человек не может думать на ассемблере. А бит один или несколько? Если один, то можно вначале проверить на 0, потом маска 0x0f, потом 0x33, потом 0x55 -- 4 операции вместо 8-и. Ведь на самом-то деле цель не проверить бит N-ый, а отыскать какие fk0(86 знак., 04.03.2011 13:24)
- Что за mulu? И разве в указатель на mask загружается не удвоенное число? - mazur(04.03.2011 13:22)
- Ага, что-то такое и хотел написать, но потом зацепился за макросы, а потом уже машина пришла и я побежал :-) Только там фрагмент можно на слово короче написать: ldzl,z sbrczl,2 swapah andizl,3clrzh subizl,low -ReAl-(85 знак., 05.03.2011 09:22, )
- Супер! - leon_(28.02.2011 22:52)