MBedder, терминатор (04.03.2011 12:26 - 25.03.2011 03:21, просмотров: 393) ответил 580BM80 на Вот код, который покороче будет:
"Не корысти ради"(с) - еще чуток покороче и побыстрее :)) ; Arbitrary bit structure address, 21 clocks ANY case, 18 program memory words, 5 registers
; Input: ZH:ZL = bit structure starting address, r16 = bit # to be tested
btest:
ldi r17,32
mulu r16,r17 ; r1 = byte #
clr r17
add ZL,r1
adc ZH,r17 ; [Z] = byte to be tested
ld r18,Z ; r18 = byte to be tested
andi r16,7 ; r16 = bit position to be tested
ldi ZL,low(masks*2)
ldi ZH,high(masks*2)
add ZL,r16
adc ZH,r17
lpm r16,Z ; r16 = bit mask ("1" in a bit to be tested)
and r16,r18 ; SREG.Z = tested bit
ret
masks: .db 1,2,4,8,16,32,64,128
-
- Не думал, что эту тему снова поднимут. Раз так, спрошу, откуда взялась цифра именно 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)