Der Code schreibt 6 RGB Werte aus dem Speicher, hier der Datasection, in die Prozessorregister r8 bis r13. Auf die Register kann dann quasi gleichzeitig zugegriffen werden.
Ablauf: Die Adresse von mydata: wird in die Variable RegRAX geschrieben.
Die Variable RegRAX wird in das Register rax geschrieben.
Der Inhalt von der Adresse rax wird in das Register r8 geschrieben.
Der Inhalt von der Adresse rax+3 wird in das Register r9 geschreiben.
...
Inhalt Register ist:
R8 : 8899AABBCCDDEEFF
R9 : 5566778899AABBCC
R10 : 2233445566778899
R11 : FE00112233445566
R12 : 0000EDFE00112233
R13 : 0030500000EDFE00
Nur die letzten 3 Byte sind wichtig.
Um an das 2. Byte von R8 zu kommen mache ich SAR r8,8 und hole das unterste Byte von R8 mit dem R8L-Register heraus zur weiteren Verarbeitung, hier Ausgabe mit Debug.
Mit Zeigern kann man einfach auf Daten zugreifen:
Code: Alles auswählen
Structure DreiByteTyp : Dreier.a[3] :EndStructure
Structure SechsMalDreiByteTyp : z18.a[18] : EndStructure
*Zeiger.DreiByteTyp=?mydata
*z.SechsMalDreiByteTyp=*Zeiger
Debug Hex(*Zeiger\Dreier[1],#PB_Byte)
Debug Hex(*z\z18[1],#PB_Byte)
*Zeiger+3
Debug Hex(*Zeiger\Dreier[0],#PB_Byte)+" "+Hex(*Zeiger\Dreier[1],#PB_Byte)+" "+Hex(*Zeiger\Dreier[2],#PB_Byte)
*Zeiger+$C
Debug Hex(*Zeiger\Dreier[0],#PB_Byte)+" "+Hex(*Zeiger\Dreier[1],#PB_Byte)+" "+Hex(*Zeiger\Dreier[2],#PB_Byte)
Debug Hex(*z\z18[15],#PB_Byte)+" "+Hex(*z\z18[16],#PB_Byte)+" "+Hex(*z\z18[17],#PB_Byte)
DataSection : mydata:
Data.a $FF,$EE,$DD,$CC,$BB,$AA,$99,$88,$77,$66,$55,$44,$33,$22,$11,$00,$FE,$ED : EndDataSection