Åh. Jag skulle väl säga att det finns väl knappast en instruktion som modifierar något som inte kan potentiellt förstöra allt. Maskinkod är ju i princip alltid utan både hängslen och bälte. Om något kan man väl kanske säga att ifall man kör en PDP-11 med split I/D space, så har man potentiellt något mycket säkrare än en hel massa annat.
Ja, att PC är ett register som alla andra kan ha flera intressanta effekter. Assemblern kodar # konstanter som (PC)+ ja. Finns liksom inget annat sätt.
Fler trevliga effekter: På en PDP-11 kan du göra både CMP #4711,R0 och CMP R0,#4711. Vilket kan vara trevligt om du vill ha kod som reflekterar hur du tänker. Om du har ett värde mellan 0 och 4, och vill hoppa till olika rutiner baserat på det, så kan du ju göra följande på en PDP-11:
Kod: Markera allt
ASL R0
ADD R0,PC
BR foo0
BR foo1
BR foo2
BR foo3
;
; Hantera foo4...
;
Poängen är att detta är helt PIC utan någon ansträngning. Lika enkelt som en hopptabell, men utan några absoluta addresser. Men givetvis skulle man kunnat ha en tabell med, och bara adderat värdet ur den tabellen till PC, och kommit vart man ville och fortfarande vara PIC (om tabellen innehöll relativa offsets).
Likaså är en hel del annat ganska lätt, eller tillochmed naturligt att få PIC.
Kod som:
är naturligt PIC, för koden som genereras blir:
Kod: Markera allt
MOV @n(PC),R0
.WORD FOO-.
.
.
.
FOO: .WORD 4711
Dvs, addresseringsmoden på första argumentet till MOV är här en konstant adderad till registret, och det är sedan den address där värdet hämtas från. Och med PC som register, så blir ordet som ska adderas bara offsetten mellan instruktionen och addressen där data ligger.
Och ja, man kan ju lätt se inspiration från PDP-11 i 68K. VAX är ju en extension av PDP-11 med, så det är väldigt likt där också.