> Detta gäller normal alla processorer, oavsett om det är PIC, AVR, ARM, x86 eller nån annan.
Man kan inte direkt jämföra PIC/AVR (20-30 MHz), ARM (hundratals MHz) och "stora"
processorer som går i flera GHz och har långsammare externa minnesbussar. Det är
väl självklart att man har olika arkitekturer i de fallen! AVR har en arkitektur som
liknar de från de stora processorerna utan att det ger någon direkt fördel, det
bara tillför extra komplexitet i arkitekturen.
> Ett problem i en diskussion som denna är väl att en term så som "register" inte har någon entydig strikt definition,
Exakt, det är därför som jag föredrar att kalla det "minne" lite mer generellt.
Det intressanta är att jämföra en AVR med 1024 bytes "minne" med en PIC
med 1024 bytes "minne". Och då anser jag att PIC har en "renare" arkitekur,
vilket även återspeglas i den enklare instruktionsuppsättningen.
> Vad skall man då kalla t.ex. W som har en särställning i instruktionsuppsättningen?
Ja, det kallas ju "Working Register" och visst, det har några unika funktioner. Man samtidigt
ligger W i minnesmappen (WREG på PIC16F1xxx serien) och man kan alltså använda alla
instruktioner som jobbar direkt mot vanliga "register" även mot W, om man vill. T.ex
Bit Set/Clear File (BCF/BSF) jobbar inte mot W, men fungerar bra mot WREG.
Men du har helt rätt i (och som jag skrev tidigare) att det hela mest är semantik.
Det är ointressant vad det kallas, det som är intressant är funktionen och arkitekturen.
> Det går väl inte att i en instruktion säga minnesplats1 = minnesplats2 + minnesplats3
> som exempel? Man måste väl säga W <- minnesplats2, W <- W+minnesplats3 och
> sedan minnesplats1 <- W i tur och ordning?
Korrekt, men det fungerar å andra sidan så generellt över hela minnet. På en AVR
fungerar det enbart direkt *OM* datat redan ligger i ett antal "register". Om alla tre
platserna ligger i det som på AVR kallas "Data Space" så tillkommer 2 LD och 1 ST.
Sen så har vi inte alls nämnt att på vissa AVR'er så ligger vissa kontrollregister utanför
"I/O Memory" och kan bara adresseras via "Data Space". D.v.s att för vissa register
använder man IN/OUT och för andra LDx/STx. I/O memory är begränsat till 64 adresser.
Dessutom är I/O memory delat i två delar där vissa instruktiner enbart fungerar mot den
låga delen, t.ex bit-test instruktionerna som man ofta använder för att kolla status på
olika delar. Ett bra exempel är USART registren som beroende på modell kan ligga i lägre
eller högre delen av I/O Memory.Denna tråd är väl ett bra exempel på den förvirringen:
http://www.avrfreaks.net/index.php?name ... 1&start=20
Ovanstående problem med att göra att SBIS enbart fungerar mot *halva* I/O Memory (0-31),
och på (t.ex) Mega88 hade USART registren glidit upp i övre halvan av I/O memory. D.v.s att
bit-testerna inte längre fungerar och man måste ta omvägen över att först kopiera USART
registret till ett "register" (förvirrande?

). Det betyder också att kod inte är porterbar,
om man inte kör ett par speciella macron som Atmel erbjuder.
Ovanstående är fullständigt okänt på PIC, det är en adressmapp som är gemensam för allt.