Azért a #define csodákat tud ám művelni, ha valamit nem értesz. ;)
A "külső hardvertámogatás" éppúgy a cpu része, mint az a tény, hogy AVR esetén éppen az r27+r26 == X. Pl. a 8080-nál a (HL) neve M regiszter. Azaz az A, B, C, D, E, H, L regiszterek mellé került egy M, amit ugyanúgy használhatsz, mint a többit, csak éppen a HL regiszterpárral címzett bájtot jelenti.
Képzeld el, hogy FSR0 = X, FSR1=Y és FSR2=Z, FSR0L=XL=R26 (stb.) és máris AVR-t fogsz látni. Az st X=mov?? INDF0, az st X+ = mov?? POSTINC0 ... stb., tehát X=INDF0, X+=POSTINC0, stb. Az, hogy miként valósítja meg a cpu az az utasításkészlet és a regiszterek számának függvénye.
MOVLB 15 (extended módban)
ldi r30,lo8(a) LFSR FSR0, a (X=&a, mivel &a statikus)
(de AVR Z=&a ??????)
ldi r31,hi8(a)
ldi r24,lo8(20) MOVLW 20 (W=i=20)
mov r26,r30 (AVR X=Z ??????)
mov r27,r31
0:
st X+,__zero_reg__ CLRF POSTINC0 (*X++=0)
dec r24 DECFSZ WREG
brne 0b BRA 0:
ret RET
Én nem látok különbséget.
A "külső hardvertámogatás"azért is poénos, mert a nyomorult processzor egyetlen nyomorult W regisztere is "külső hardvertámogatás" segítségével is elérhető.
Pl. a POSTINC0 az FEEh, míg a W (WREG álnéven) az FE8h címen tartózkodik. Így aztán egy regiszter sincs, csak "külső hardvertámogatás". Szerinted.
Extended módban már primitív frame pointer / enter-leave technika támogatás is van ezekre az indexregiszterekre.