home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best of German Only 1
/
romside_best_of_german_only_1.iso
/
anwender
/
sim
/
sim51_04.arj
/
DIS51.DOC
< prev
next >
Wrap
Text File
|
1992-12-31
|
9KB
|
223 lines
DIS51 Disassembler für HEX-Code der 8051 Familie
================================================
DIS51 wurde in Assembler-Sourcecode geschrieben und mit MASM 5.10 compiliert.
DIS51 lädt Code für 8051-CPU's im HEX-, ABSOUT- oder BINÄR-Format. Der Code
wird Schritt für Schritt durchgegangen. Nur die 8051-Befehle, die dabei be-
rüht werden, werden in Mnemonics disassembliert. Die anderen Code-Bytes blei-
ben als DB-Direktive stehen.
Der erzeugte Code (Memomics) entspricht den Regeln für den ASM51 von Intel.
Source-File:
------------
Disassembliert werden können nur Files, die Code in (Intel-) HEX-, ABSOLUT-
oder BINÄR-Format beinhalten. Default wird ein HEX- oder ABSOLUT-File erwar-
tet. Die Unterscheidung erfolgt automatisch anhand des ersten Bytes des
Source-Files: Beim HEX-File steht dort ':' und beim ABSOLUT-File 02h für
Modul-Open Record Typ.
Handelt es sich bei dem Source-File um einen BINÄR-File, so ist dem File-
Namen beim Aufruf ein '$' voranzustellen.
(Anmerkung: Intel ASM51 produziert OBJECT-Code, RL51 produziert ABSOLUT-
Code und OH51 produziert HEX-Code. BINÄR-Code wird bei einigen Eprommern
und einfacheren Assemblern verwendet. Der TASM erzeugt nur HEX- oder
Binär-Code.)
Output-File:
------------
DIS51 generiert als Output-File einen Assembler-Source-File. Dieser File ist
durch den ASM51 von Intel wieder direkt reassemblierbar. Er erhält denselben
Namen wir der Input-File, jedoch mit der Endung "d51" (Achtung: existierende
Files mit diesen Namen werden überschrieben).
Beispiel für einen von DIS51 erzeugten Assembler-Source-File:
╔═══════════════════════════════════════════════════════════════════════════╗
║ $NOMOD51 ║
║ ;Disassembler Outputfile DIS51 Ver 2.0 (c) 1991 W.Hennig ║
║ ;------------------------------------------------------------------------ ║
║ ; Source File: BASIC52.HEX ║
║ ║
║ ;PUBLIC Timer2 ║
║ ║
║ _0064 CODE 64h ;EXTRN CODE(_0064) ║
║ _402B CODE 402Bh ;EXTRN CODE(_402B) ║
║ ║
║ $INCLUDE(\ASM51\INC\reg52.pdf) ║
║ ║
║ ORG 2Bh ║
║ ;Timer2: ║
║ PUSH PSW ;002B C0 D0 ║
║ JB 20h, _0033 ;002D 20 20 03 ║
║ LJMP _402B ;0030 02 40 2B ║
║ _0033: SETB RS1 ;0033 D2 D4 ║
║ CLR RS0 ;0035 C2 D3 ║
║ MOV R7, ACC ;0037 AF E0 ║
║ MOV R0, 0h ;0039 A8 00 ║
║ SJMP _0064 ;003B 80 27 ║
║ DB 45h ;'E' ;003D 45 ║
║ DB 58h ;'X' ;003E 58 ║
║ DB 49h ;'I' ;003F 49 ║
║ DB 54h ;'T' ;0040 54 ║
║ ║
║ END ║
╚═══════════════════════════════════════════════════════════════════════════╝
Die vom Anwender definierten Einsprungadressen werden hinter dem ASM51-
Schlüsselwort PUBLIC angegeben. Die Eintragung ist aber durch ein ; als
Kommentar gekennzeichnet.
Für Adressen werden grundsätzlich Labels verwendet. Der disassemblierte
Code kann so, mit einer anderen ORG-Direktive versehen, reassembliert
werden. Adressen, die nicht innerhalb des geladenen Codes liegen, werden
mit einer CODE-Direktive definiert. Dahinter steht mit einem ; die ent-
sprechende EXTRN-Direktive. Vor der Reassemblierung kann der Anwender
die eine oder andere Eintragung stehen lassen.
Wenn innerhalb des Codes ein Sprung auf eine Adresse erfolgt, steht links
ein Label. Ist der Adresse ein Variablenname zugeordnet (default, über einen
Include-File oder aus einem Absolut-File), so wird dieser Name eingetragen. An-
sonsten wird dafür die Adresse mit einem vorgestellten _ verwendet. Vor
Labels, die beim ASM51 vordefiniert sind, steht ein ; damit der Assembler
keinen Fehler anzeigt.
In der Mitte stehen die Mnemonics. Für Daten-Adressen (DATA, BIT) werden,
wenn definiert, die Variablen-Namen eingetragen.
Rechts ist als Kommentar die Code-Adresse gefolgt von dem ursprünglichen
Hexcode angegeben.
Wurde eine geladene Code-Adresse mit den angegebenen Einsprung-Adressen
nicht erreicht, so bleibt sie als DB-Direktive stehen. Es könnte sich
ja auch um eine Tabelle oder einen Text handeln. Als Kommentar ist das
entsprechende ASCII-Zeichen angegeben. Allerdings werden ASCII-Zeichen
kleiner 20h nicht angegeben, da viele Zeichen unter 20h als Steuerzeichen
bei Druckern dienen. Zusätzlich werden die Zeichen ascii25h = % und
ascii27h = ' nicht angegeben, da sonst ASM51 Fehler macht. Dasselbe gilt
auch für ASCII-Codes größer 80h, die ASM51 gar nicht behandelt, und von
denen einige selbst in Kommentaren bei der Re-Assemblierung zu Fehlern
führen: ascii8Ah, ascii8Dh, asciiA5h, asciiA7h.
Variablen-Namen:
----------------
Ebenso wie der ASM51-Assembler verwendet DIS51 default die SFR-Definitionen
des 8051. Zusätzlich oder als Ersatz kann ein Include-File mit weiteren oder
anderen SFR-Definitionen angegeben werden.
Ein Include-File für DIS51 darf nur folgende ASM51-kompatible Direktiven be-
inhalten:
CODE, XDATA, DATA, IDATA, BIT, EQU
Andere ASM51-Direktiven werden nicht unterstützt. Natürlich sind Kommentare
innerhalb des Include-Files erlaubt. Als Kommentar gelten alle Zeichen inner-
halb einer Zeile, die einem ; folgen.
Wird bei DIS51 der Schalter NOMOD51 gesetzt, so sind die 8051-spezifischen
Register Definitionen abgeschaltet. Die Code-Einsprünge für
RESET, EXTI0, EXTI1, Timer0, Timer1, SINT
bleiben vordefiniert (genauso wie bim ASM51). Im Output-File wird $NOMOD51
eingetragen.
Ist nicht NOMOD51 gewählt, so sind default alle SFR des 8051 definiert. Der
ASM51-Assembler hat hier jedoch einen kleinen Fehler: er kennt PCON nicht.
Diese eine Definition wird von DIS51 deßhalb in den Output-File geschrieben.
Wird ein Absolut-File geladen, so übernimmt DIS51 die SFR-Definitionen aus
dem Absolut-File (soweit vorhanden). Ein Absolut-File enthält nur dann
SFR-Definitionen, wenn bei der Assemblierung mit dem ASM51 der Schalter
DEBUG gesetzt war. Sind CODE-Definitionen enthalten, so werden diese CODE-
Adressen als Einsprung-Adressen markiert.
Bei der Disassemblierung werden Code-, Data-, und Bit-Adressen durch die vor-
definierten Variablen ersetzt. In einer internen Liste von DIS51 stehen die
geladenen SFR-Definitionen der Reihe nach:
jene aus dem Absolut-File
die default bekannten 8051-SFR (wenn nicht -nomod51)
jene aus dem Include.File
Der bei der Disassemblierung zuerst gefundene Variablenname (zu einer Adresse)
wird eingesetzt, auch wenn noch andere Variablennamen für die gleiche Adresse
definiert sind.
Aufruf:
-------
Der Disassembler kann mit folgenden Parametern aufgerufen werden:
DIS51 Es erscheint erst eine Erklärung zum Aufruf.
DIS51 <$>source <-nomod51> <-iInclude> <-Adr> <-Adr> ... Die Angaben
in <> sind
optional. Der Source-File muß Code im HEX- oder im ABSOLUT-
Format enthalten. Es können auch BINÄR-Files geladen werden,
Dann ist ein $ voranzustellen. Die obige Reihenfolge ist
einzuhalten. Es können so viele Einsprungadressen eingegeben
werden, bis die Eingabezeile voll ist.
DIS51 @inputFile Die Parameter können optional über einen Input-File
eingegeben werden. Innerhalb des Input-Files ist
dieselbe Reihenfolge einzuhalten wie oben.
Ansonsten können an beliebiger Stelle SPACE, TAB, Carriage-
Return oder Kommentar stehen.
Als Kommentar werden alle Einträge gewertet, die nicht durch
ein - eingeleitet werden. Der erste Eintrag im Input-File
muß der Source-Filename sein (ohne vorangestelltes -).
Innerhalb von Kommentaren darf kein - verwendet werden! Bei
zu großen Input-Files werden nur die ersten 8 kByte ausgewer-
tet.
Die Fehlermeldung:
*** Einsprungadressen hinter - als Hexzahl angeben
deutet meißt auf ein - innerhalb eines Kommentars hin.
Arbeitsweise:
-------------
Der Disassembler ließt zuerst die Eingaben (von Input-File oder Tastatur).
Der 8051-Code wird in ein eigenes Segment (64 kByte) geladen. In einem
weiteren Buffer (32 KByte) wird für jedes Code-Byte ein Flag (Nibble) ge-
setzt