Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
uint16_t counters[8];
void cnt(uint8_t b)
{
uint8_t i=8;
uint16_t *p = counters;
do {
if( b & 0x01) ++*p;
b >>= 1;
++p;
} while(--i);
}
Ближайшим аналогом твоего ассемблерного кода будет: uint16_t counters[8]; void cnt(uint8_t b)
#include
{
uint8_t i=8;
uint16_t *p = counters;
do {
*p++ += (b & 0x01);
b >>= 1;
} while(--i);
}
код
.global cnt
.type cnt, @function
cnt:
/* prologue: frame size=0 */
/* prologue end (size=0) */
mov r20,r24
ldi r30,lo8(counters)
ldi r31,hi8(counters)
.L2:
mov r18,r20
clr r19
andi r18,lo8(1)
andi r19,hi8(1)
ld r24,Z
ldd r25,Z+1
add r24,r18
adc r25,r19
st Z+,r24
st Z+,r25
lsr r20
ldi r24,hi8(counters+16)
cpi r30,lo8(counters+16)
cpc r31,r24
brne .L2
ret
/* function cnt size 19 (18) */
Кстати, С для AVR - LOW ENDIAN, младший байт многобайтовых значений хранится по младшему адресу. У тебя в коде наоборот.