ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
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.

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