Да запросто, на короткой структуре загрузка адресов, вызов/возврат, универасльный цикл с 16-битным счётчиком на все случаи жизни...
Но только компиляторы тоже давно грамотные.
Код
#include <stdint.h>
#include <string.h>
uint8_t a1[32], a2[32];
void foo() { memcpy(a1, a2, 4); }
void moo() { memcpy(a1, a2, 32); }
Код
.text
foo:
lds r24,a2
lds r25,(a2)+1
lds r26,(a2)+2
lds r27,(a2)+3
sts a1,r24
sts (a1)+1,r25
sts (a1)+2,r26
sts (a1)+3,r27
ret
moo:
ldi r26,lo8(a1)
ldi r27,hi8(a1)
ldi r30,lo8(a2)
ldi r31,hi8(a2)
ldi r24,lo8(32)
.L2:
ld r0,Z+
st X+,r0
subi r24,lo8(-(-1))
brne .L2
ret