|
Optimierungstechniken 68000 Assembler
Auf dieser Seite zeige ich einige Techniken zur Optimierung der Assemblerprogrammierung für die 68008 und 68000 Prozessoren. Optimierungen gegenüber der Standardprogrammierung ergeben sich im Umfang des vom Assembler erzeugten Codes und / oder der Geschwindigkeit der Ausführung des Codes. Bei einigen Optimierungsvorschlägen kann sich eine Erhöhung der Codegröße zugunsten der Geschwindigkeit oder eine Erhöhung der Ausführungszeit zu Gunsten der Codegröße ergeben.
Konventionen
Der Umfang des Codes ist für alle Prozessoren in Bytes angegeben.
Die Ausführungszeiten sind in der Reihenfolge 68008 / 68000 / 68020 angegeben.
Allgemeine Befehle
Einsatzzweck |
Standardcode |
Optimierter Code |
Löschen eines Datenregisters |
CLR.L Dx |
Bytes: 2 Takte: 10 / 6 |
MOVEQ.L #0,Dx |
Bytes: 2 Takte: 8 / 4 |
Löschen eines Adressregisters |
MOVE.L #0,Ax |
Bytes: 6 Takte: 24 / 12 |
SUB.L Ax,Ax |
Bytes: 2 Takte: 10 / 6 |
Löschen der oberen Hälfte eines Datenregisters |
AND.L #$FFFF,Dx |
Bytes: 6 Takte: 26 / 14 |
SWAP Dx CLR.W Dx SWAP Dx |
Bytes: 6 Takte: 24 / 12 |
Schneller Vergleich mit kleinen Zahlen Benötigt ein freies Datenregister Dn |
CMP.L #n,Dx |
Bytes: 6 Takte: 26 / 14 |
MOVEQ #n,Dn CMP.L Dn,Dx |
Bytes: 4 Takte: 18 / 10 |
Arithmetik
Einsatzzweck |
Standardcode |
Optimierter Code |
Multiplikation mit Zweierpotenzen
|
MULU #2,Dx |
Bytes: 4 Takte: 82 / 74 |
EXT.L Dx ASL.L #1,Dx |
Bytes: 4 Takte: 22 / 14 |
Multiplikation mit 2
|
ASL #1,Dx |
Bytes: 2 Takte: 14 / 10 |
ADD Dx,Dx |
Bytes: 2 Takte: 8 / 4 |
Multiplikation mit 4
|
ASL #2,Dx |
Bytes: 2 Takte: 16 / 12 |
ADD Dx,Dx ADD Dx,Dx |
Bytes: 4 Takte: 16 / 8 |
Multiplikation mit festen Faktoren (10) Benötigt ein freies Datenregister Dn Für andere Faktoren mit Umstellungen geeignet |
MULU #10,Dx |
Bytes: 4 Takte: 82 / 74 |
MOVE Dx,Dn ADD Dx,Dx ; *2 ADD Dx,Dx ; *4 ADD Dn,Dx ; *5 ADD Dx,Dx ; *10 |
Bytes: 10 Takte: 40 / 20 |
Division durch Zweierpotenzen
|
DIVU #2,Dx |
Bytes: 4 Takte: 152 / 144 |
EXT.L Dx ASR.L #1,Dx |
Bytes: 4 Takte: 22 / 14 |
Schleifen & Sprünge
Einsatzzweck |
Standardcode |
Optimierter Code |
Kurze Sprünge Sprungweite maximal +/- 126 Bytes |
BRA Label |
Bytes: 4 Takte: 18 / 10 |
BRA.S Label |
Bytes: 2 Takte: 18 / 10 |
Kurze bedingte Sprünge Sprungweite maximal +/- 126 Bytes |
Bcc Label |
Bytes: 4 Takte: 18 / 10 |
Bcc.S Label |
Bytes: 2 Takte: 18 / 10 |
Kurze Unterprogrammaufrufe Sprungweite maximal +/- 126 Bytes |
BSR Routine |
Bytes: 4 Takte: 34 / 18 |
BSR.S Routine |
Bytes: 2 Takte: 34 / 18 |
Schnelle Schleifen Sprünge normalerweise nicht ausführen Spart pro Durchlauf 6 Takte (68008) bzw. 2 Takte (68000) |
Loop: TST.B (Ax)+ BNE.S Loop Weiter: |
Bytes: 4 Takte: * / * |
Loop: TST.B (Ax)+ BEQ.S Weiter TST.B (Ax)+ BNE.S Loop Weiter: |
Bytes: 8 Takte: * / * |
Unterprogrammtechniken
Einsatzzweck |
Standardcode |
Optimierter Code |
Unterprogrammaufruf Wenn eine Subroutine direkt vor einem RTS aufgerufen wird |
JSR Routine RTS |
Bytes: 8 Takte: 72 / 36 |
JMP Routine |
Bytes: 6 Takte: 24 / 12 |
Unterprogrammaufruf Wenn nach einer Subroutine direkt weiter verzweigt wird |
JSR Routine JMP Other |
Bytes: 12 Takte: 96 / 48 |
PEA Other JMP Routine |
Bytes: 12 Takte: 64 / 32 |
Schnelle Unterprogrammaufrufe Speziell in Schleifen zu verwenden benötigt ein zusätzliches freies Adressregister An
Codeumfang und Ausführungszeiten sind nur für Aufruf des Unterprogramms und den Rücksprung angegeben |
Loop: JSR Routine BRA.S Loop Routine: ... RTS |
Bytes: 8 Takte: 72 / 36 |
LEA Return,An Loop: JMP Routine Return: BRA.S Loop Routine: ... JMP (An) |
Bytes: 8 Takte: 40 / 20 |
|