Home |
8086 Assembler,
|
Zurück zur Assemblerauswahlseite |
Zurück zu DEBUG |
| Diese Seite wurde mit Hilfe des Disassemblers ASMGEN3 erstellt. Es handelt sich um ein Programm zum Disassemblieren: Aus ausführbaren MS-DOS-Assemblerprogrammen (COM und EXE) wird ein Assemblerquellprogramm erstellt. Man kann es hier herabladen, oder man sucht nach „ASMGEN3.ZIP download“. Das herabgeladene ZIP-Archiv beinhaltet eine Bedienungsanleitung für das Programm in englischer Sprache. Die Bedienungsanleitung beschreibt auch den Aufbau der weiter unten auf dieser Seite erwähnte SEQ-Steuerungsdatei. Es fehlt darin lediglich der auf dieser Seite gemachte Hinweis auf das Dateiende mit 1AH (Steuerung Z).
Weiterhin beinhaltet das ZIP-Archiv unter dem Namen ASMGEN3.ASM den Quellcode des Disassemblerprogramms. Es entstand durch Rückassemblierung und manuelle Überarbeitung. Disassemblieren - darf man das überhaupt ?Man darf es dann, wenn der Urheberrechtsinhaber damit einverstanden ist.Es gibt Umstände, unter denen man es darf, obwohl der Urheberrechtsinhaber damit nicht einverstanden ist. Diese Umstände sind im Gesetz über das Urheberrecht und verwandte Schutzrechte in §65e und §69g Absatz 2 genannt. COM-Progamme lassen sich aufgrund ihrer einfachen Struktur wesentlich leichter disassemblieren als EXE-Prpogramme. Der Disassembler ASMGEN3 ist grundsätzlich auch zur Disassemblierung von EXE-Propgrammen geeignet. Es ist jedoch ein mühsames Geschäft, denn die manuelle Nacharbeit ist ungleich größer als bei der Disassemblierung von COM-Programmen. Als Versuchsobjekt dient hier das ausführbare Programm JN.COM. Es entstand aus JN.ASM: .MODEL TINY
;=====================================
; Eingabe Ja oder Nein nach Hinweisanzeige
;======================================
;
.CODE
ORG 100h
_start: mov dx,offset hinweis
mov ah,9 ;Hinweis anzeigen
int 21h
mov ah,08h ;lese 1 Zeichen von Tastatur
int 21h
or al,20h ;Eingabe wird Kleinschrift
cmp al,'j'
mov al,0 ;Return-Code auf 0
je fertig
inc al ;Return-code auf 1 falls nicht "j"
fertig: mov ah,4ch ;Programm beenden
int 21h
hinweis db "Bitte genen Sie j oder j fuer Ja und N oder N fuer Nein ein: $"
END _start
1. Disassemblierung ohne SEQ-SteuerungsdateiVor der Disassemblierung hat es sich bewährt, das ausführbare Programm umzubenennen oder in eine Datei mit anderem Namen zu kopieren. Der Disassembler erzeugt eine neue Quelldatei; deren Namen wird aus dem Namen des ausführbaren Programms abgeleitet.Hier hat das ausführbare Programm den neuen Namen JNDEMO.COM erhalten. Die erste Disassemblierung wird gestartet mit (blaue Schrift kennzeichnet Eingaben): D:\DOS\ML\TEST>asmgen3 jndemo.com,,; File JNDEMO.SEQ not found Building Reference Table Writing D:JNDEMO.ASM Bytes in output file: 0A6DH Writing D:JNDEMO.TBL Bytes in output file: 0218H 0:14:56:54 D:\DOS\ML\TEST>dir jndemo.* Volume in drive D is HP_D Serial number is 402E:2809 Directory of d:\dos\ml\test\jndemo.* jndemo.asm 3072 7.03.11 14:56 jndemo.com 87 7.03.11 14:49 jndemo.tbl 1024 7.03.11 14:56 Das disassemblierte Programm JNDEMO.ASM wird z.B. durch den NOTEPAD-Editor etwas länger dargestellt als hier nachfolgend gezeigt. ASMGEN3 kennzeichnet das Ende des Quellprogramms mit dem Byte 1AH (Steuerung Z). NOTEPAD kennt diese veraltete Art der Endmarkierung nicht mehr. Glücklicherweise stört sich der Makroassembler ML nicht daran. Unglücklicherweise bemängelt ML all die Zeilen hinter dem Label L0119 mit den doppelten Fragezeichen. Hier müsste man mit einem Editor nachhelfen. Die Datumsangaben „3-7-111“ für den 7.März 111 deutet an, dass ASMGEN3 aus der Zeit vor dem Jahre 2000 stammt. ASMGEN wurde 1985 geschrieben. Die letzte veröffentlichte Überarbeitung ASMGEN3 erfolgte 1995. Die als Kommentar ausgegebene Information über den anfänglichen Stackpointer auf FFFF dürfte falsch sein. Bei COM-Programmen unter MS-DOS steht der Stackpointer zu Programmbeginn auf FFFE.
PAGE 58,132
TITLE JNDEMO 3-7-111 [3-7-111]
.RADIX 16
LF EQU 0AH
CR EQU 0DH
;
;INITIAL VALUES : CS:IP 0000:0100
; SS:SP 0000:FFFF
;L0000S L010F DI L0156 DI
S0000 SEGMENT
ASSUME DS:S0000, SS:S0000 ,CS:S0000 ,ES:S0000
ORG $+0100H
L0000 EQU $-100
;L0008 L0107 DI
L0008 EQU $-0F8
;L0009 L0103 DI
L0009 EQU $-0F7
;L0020 L010B DI L0128 DI L013D DI
L0020 EQU $-0E0
;L0021 L0105 CC L0109 CC L0117 CC
L0021 EQU $-0DF
;L004C L0115 DI
L004C EQU $-0B4
;L0061 L0138 DI
L0061 EQU $-9F
;L0064 L012C DI L013C DI L0141 DI
L0064 EQU $-9C
;L0065 L011D DI L011E DI L0122 DI L0127 DI L012D DI L0134 DI
; L0142 DI L0149 DI L014D DI
L0065 EQU $-9BH
;L0069 L011A DI L0124 DI L014E DI L0150 DI
L0069 EQU $-97
;L006A L010D DI L0130 DI
L006A EQU $-96
;L006E L0121 DI L0123 DI L0139 DI L014F DI L0153 DI
L006E EQU $-92
;L006F L012B DI L0140 DI
L006F EQU $-91
;L0075 L01 H
;L0100 L0156 CI
L0100: MOV DX,OFFSET L0119 ;0100 BA 19 01
MOV AH,9 ;0103 B4 09
INT 21 ;0105 CD 21
MOV AH,8 ;0107 B4 08
INT 21 ;0109 CD 21
OR AL,20 ;' ' ;010B 0C 20
CMP AL,6A ;'j' ;010D 3C 6A
MOV AL,0 ;010F B0 00
JZ L0115 ;0111 74 02
INC AL ;0113 FE C0
;L0115 L0111 CJ
L0115: MOV AH,4C ;'L' ;0115 B4 4C
INT 21 ;0117 CD 21
;L0119 L0100 DI
L0119: INC DX ;0119 42
DB 69 ?? ;011A 69
JZ L0191 ;011B 74 74
DB 65 ?? ;011D 65
AND [BX+65],AH ;011E 20 67 65
DB 6E ?? ;0121 6E
DB 65 ?? ;0122 65
DB 6E ?? ;0123 6E
AND [BP+DI+69],DL ;0124 20 53 69
DB 65 ?? ;0127 65
AND [BP+SI+20],CH ;0128 20 6A 20
DB 6F ?? ;012B 6F
DB 64 ?? ;012C 64
DB 65 ?? ;012D 65
JB L0150 ;012E 72 20
DB 6A ?? ;0130 6A
AND [BP+75],AH ;0131 20 66 75
DB 65 ?? ;0134 65
JB L0157 ;0135 72 20
DEC DX ;0137 4A
DB 61 ?? ;0138 61
AND [DI+6E],DH ;0139 20 75 6E
DB 64 ?? ;013C 64
AND [BP+20],CL ;013D 20 4E 20
DB 6F ?? ;0140 6F
DB 64 ?? ;0141 64
DB 65 ?? ;0142 65
JB L0165 ;0143 72 20
DB 6E ?? ;0145 6E
AND [BP+75],AH ;0146 20 66 75
DB 65 ?? ;0149 65
JB L016C ;014A 72 20
DEC SI ;014C 4E
DB 65 ?? ;014D 65
DB 69 ?? ;014E 69
DB 6E ?? ;014F 6E
;L0150 L012E CJ
L0150: AND [DI+69],AH ;0150 20 65 69
DB 6E ?? ;0153 6E
CMP AH,[BX+SI] ;0154 3A 20
AND AL,0 ;0156 24 00
;L0157 L0135 CJ
L0157 EQU $-1
;L0165 L0143 CJ
L0165 EQU $+0DH
;L016C L014A CJ
L016C EQU $+14
;L0191 L011B CJ
L0191 EQU $+39
S0000 ENDS
;
END L0100
2. Disassemblierung mit SEQ-SteuerungsdateiMan kann jedoch bereits vor der Disassemblierung etwas machen. Dazu wird das ausführbare Programm mit DEBUG inspiziert. Unschwer ist zu erkennen, dass ab der Adresse 0119H kein Programmcode steht. Es handelt sich um eine ASCII-codierte Zeichenkette. Diese Eigenschaft kann man ASMGEN in der Datei JNDEMO.SEQ mitteilen. Deren Inhalt ist unterhalb der DEBUG-Darstellung angegeben. D:\dos\ML\Test>debug jndemo.com -d 1A97:0100 BA 19 01 B4 09 CD 21 B4-08 CD 21 0C 20 3C 6A B0 ......!...!. <j. 1A97:0110 00 74 02 FE C0 B4 4C CD-21 42 69 74 74 65 20 67 .t....L.!Bitte g 1A97:0120 65 6E 65 6E 20 53 69 65-20 4A 20 6F 64 65 72 20 enen Sie J oder 1A97:0130 6A 20 66 75 65 72 20 4A-61 20 75 6E 64 20 4E 20 j fuer Ja und N 1A97:0140 6F 64 65 72 20 6E 20 66-75 65 72 20 4E 65 69 6E oder n fuer Nein 1A97:0150 20 65 69 6E 3A 20 24 00-00 00 00 00 00 00 00 00 ein: $......... 1A97:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A97:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -q D:\dos\ML\Test> Die Datei JNDEMO.SEQ ist nachfolgend dargestellt. Sie benötigt an ihrem Textende das Steuerzeichen 1AH (Steuerung Z, hier dargestellt durch →). „Moderne“ Editoren wie NOTEPAD erzeugen dies Steuerzeichen nicht mehr. Der Editor EDLIN (zu finden unter %systemroot%\system32) dagegen ist geeignet. Viel Spaß damit! ;.seq fuer Rueckassemblierung von JNDEMO.COM mit asmgen3 0100 /h 0119 S ;ASCII-Zeichenkette am Programmende → Bei Vorhandensein der Steuerdatei JNDEMO.SEQ sieht das Ergebnis der Rückassemblierung viel freundlicher aus. Sogar der Tippfehler beim Wort „geben“ des ursprünglichen Quellprogramms ist klar ersichtlich. Das erzeugte Quellprogramm lässt sich assemblieren. Es laufen der ML-Assembler und der Linker fehlerfrei durch. Sie erzeugen ein bytegenaues Abbild des ursprünglichen ausführbaren Programmes JNDEMO.COM. Schade ist, dass sie Kommentare des originalen Quellprogramms nicht aus dem ausführbaren Programm erzeugt werden können. Auch ist das originale Quellprogramm für einen fachkundigen Menschen einfacher zu interpretieren als das durch Rückassemblierung erzeugte Quellprogramm.
PAGE 58,132
TITLE JNDEMO 3-7-111 [3-7-111]
.RADIX 16
LF EQU 0AH
CR EQU 0DH
;
;INITIAL VALUES : CS:IP 0000:0100
; SS:SP 0000:FFFF
;L0000S L010F DI L0156 DI
S0000 SEGMENT
ASSUME DS:S0000, SS:S0000 ,CS:S0000 ,ES:S0000
ORG $+0100H
L0000 EQU $-100H
;L0008 L0107 DI
L0008 EQU $-0F8H
;L0009 L0103 DI
L0009 EQU $-0F7H
;L0020 L010B DI
L0020 EQU $-0E0H
;L0021 L0105 CC L0109 CC L0117 CC
L0021 EQU $-0DFH
;L004C L0115 DI
L004C EQU $-0B4H
;L006A L010D DI
;L0100 L014E CI
L0100: MOV DX,OFFSET L0119 ;0100 BA 19 01
MOV AH,9 ;0103 B4 09
INT 21H ;0105 CD 21
MOV AH,8 ;0107 B4 08
INT 21H ;0109 CD 21
OR AL,20H ;' ' ;010B 0C 20
CMP AL,6AH ;'j' ;010D 3C 6A
MOV AL,0 ;010F B0 00
JZ L0115 ;0111 74 02
INC AL ;0113 FE C0
;L0115 L0111 CJ
L0115: MOV AH,4CH ;'L' ;0115 B4 4C
INT 21H ;0117 CD 21
;L0119 L0100 DI
L0119 DB 'Bitte genen Sie J oder j fuer Ja und N oder n fuer Ne'
;0119 42 69 74 74 65 20 67 65 6E 65 6E 20 53 69 65 20 4A 20 6F 64 65 72 20 6A
DB 'in ein: $' ;014E 69 6E 20 65 69 6E 3A 20 24
S0000 ENDS
;
END L0100
|