ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
241430 Топик полностью
ReAl (03.03.2011 09:21 - 09:23, просмотров: 297) ответил Barinov на Соколик, если бы ты чуть понимал а программировании, то знал бы, что макросы только пишутся экономно, а код транжирят направо и налево. У тебя для анализа ПРОИЗВОЛЬНОГО бита(а автору нужно задавать произвольный номер анализируемого бита, т.к. все
Какой такой "код для вызова макроса" ??? Он уже давно написан и содержится в теле программы под названием "ассемблер", там же "вызывается" и там же и остаётся. Было либо ; одна команда - одно слово, страшная куча тактов ; + куча слов на кучу отдельных подпрограмм на каждый бит rcall get_bit_number_N ; две команды - два слова, страшная куча тактов ; + куча слов на подпрограмму, но это делится на все вызовы ldi r16, bit_number rcall get_bit_by_number ; зона хранения битов фиксирована и задана неявно стало ; две команды - три слова, три такта btest bit_number ; если зона хранения битов фиксирована и задана неявно, то и макос берёт один аргумент Если предстоит в куске кода работать с битами интеснсивно, то делается btesty, работающий по смещению к Y, который загружается адресом битовой зоны перед этим куском. Тогда и макрос даёт два слова. Но дальше всё равно с битом ещё что-то надо делать. Для логических операций типа "булевский процессор" просто дописываются макросы, навскидку где-то так ; instrumental macro .macro bget_byte ; bit_number, bit_zone_address lds r16,@1+@0/8 ; Read an (N/8)th byte of a bit array depending on bit # .endm .macro bput_byte ; bit_number, bit_zone_address sts r16,@1+@0/8 .endm .macro bput_byte_y ; bit_number std r16,Y+@0/8 .endm .macro band_r16 ; T &= bit sbrs r16,@0%8 ; Clear T if bit is 0 clt .endm .macro band_not_r16 ; T &= ~bit sbrc r16,@0%8 ; Clear T if bit is 1 clt .endm .macro bor_r16 ; T |= bit sbrc r16,@0%8 ; Set T if bit is 1 set .endm .macro bor_not_r16 ; T |= ~bit sbrs r16,@0%8 ; Set T if bit is 0 set .endm ; macro for boolean processing .macro bit_load bget_byte @0, @1 bst r16, @0 .endm .macro bit_load_y bget_byte_y @0 bst r16, @0 .endm .macro bit_store bget_byte @0, @1 bld r16, @0 bput_byte @0, @1 .endm .macro bit_store_y bget_byte_y @0 bld r16, @0 bput_byte_y @0 .endm .macro band bget_byte @0, @1 band_r16 @0 .endm .macro band_y bget_byte_y @0 band_r16 @0 .endm .macro band_not bget_byte @0, @1 band_not_r16 @0 .endm .macro band_not_y bget_byte_y @0 band_not_r16 @0 .endm И так далее, после чего булевы выражения пишутся цепочкой макрсоов, генерирующих вполне компактный и очень быстрый код. Ну для реальных выраений ещё понадобятся временные переменные, так что надо допилить, сделать ещё работу с битами в регистре (регистрах) временных переменных, чтобы не размещать их в ОЗУ.