ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
CP/M 68K
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

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.

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