debug
-
Hallo,
ich versteh die Funktionsweise von "debug" (ms-dos) nicht richtig. Soweit ich meinem Tutorial folgen kann, dürfen Assembler- Programme in debug nur aus einem Segment bestehen und müssen eine COM- Datei sein.
Nun das Problem ist, wie soll das gehen? Wie kann ich Assembler- Programme in debug schreiben, die nur aus einem Segment bestehen?
(Ich will in debug assemblieren können, weil ich auch an der Schule etwas assemblieren möchte, während die anderen ihren Kinderkram machen)
-
Original erstellt von pAngel:
Hallo,
ich versteh die Funktionsweise von "debug" (ms-dos) nicht richtig. Soweit ich meinem Tutorial folgen kann, dürfen Assembler- Programme in debug nur aus einem Segment bestehen und müssen eine COM- Datei sein.
Nun das Problem ist, wie soll das gehen? Wie kann ich Assembler- Programme in debug schreiben, die nur aus einem Segment bestehen?Wo ist das Problem? Ich habe zwar nie mit debug gearbeitet, aber jede COM-Datei ist in einem einzigen Segment. Programmierst halt so, dass du keine anderen Segmente benutzt und packst die Daten mit in das eine Segment.
**
(Ich will in debug assemblieren können, weil ich auch an der Schule etwas assemblieren möchte, während die anderen ihren Kinderkram machen)**
Sehr gute Motivation, ruft Erinnerungen hervor
-
Das Problem ist beispielsweise folgender Code für debug:
JMP 010F DB "Hallo Welt!", "$" MOV AH, 9 MOV DX, 102 INT 21 MOV AH, 4C INT 21
1. Wo sind die "h"s, wie bei "mov ah, 4CH" oder "int 21h"?
2. Ich werde aus folgender Erklärung nicht schlau:Der Sprungbefehl mit Adresse benötigt 2 Byte im Speicher. Überspringen wollen wir den String "Hallo Welt!", "$". Dafür brauchen wir noch einmal 13 Byte. Der Befehl MOV AH, 09H könnte erst im 14 Byte abgespeichert werden. Da müssen wir mit dem JMP Befehl hinspringen.
Eigentlich ist das alles was mich etwas verwirrt.
-
Original erstellt von pAngel:
1. Wo sind die "h"s, wie bei "mov ah, 4CH**" oder "int 21h"?
**Ich tippe mal Debug nimmt einfach ALLES als Hex-zahlen an (ohne Garantie)
**
2. Ich werde aus folgender Erklärung nicht schlau:Der Sprungbefehl mit Adresse benötigt 2 Byte im Speicher. Überspringen wollen wir den String "Hallo Welt!", "$". Dafür brauchen wir noch einmal 13 Byte. Der Befehl MOV AH, 09H könnte erst im 14 Byte abgespeichert werden. Da müssen wir mit dem JMP Befehl hinspringen.
Eigentlich ist das alles was mich etwas verwirrt.**
Naja, du hast alles in einem Segment, also musst du ja auch die Daten irgendwo lassen. Da du die Daten ja nicht als Code ausführen lassen willst, musst du dir was überlegen, die Daten zu überspringen, ein jmp ist da sichelrich hilfreich. Weiterhin fängt der code in COM-Dateien immer bei 0x0100 an. Jetzt musst du nur einen Sprung konstruieren, der Exakt ihnter deinen String geht.
Adresse 0100 jmp xxxx aaaa "Hallo, Welt!$" xxxx mov AH, 9
Jetzt musst du nur herausfinden, welche Adresse xxxx ist, da mit du da hinspringen kannst. Der relative Sprungbefehl ist 2 Bytes lang, also können wir einfügen:
Adresse 0100 jmp xxxx 0102 "Hallo, Welt!$" xxxx mov AH, 9
Wenn du jetzt nachzählst, ist der String 13 Zeichen lang. Also weiter:
Adresse 0100 jmp 010F 0102 "Hallo, Welt!$" 010F mov AH, 9
und siehe da, fertig
Das Problem ist halt, dass debug keine Labels etc. unterstützt und man die ganze Adressberechnung selber machen muss.