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.


Anmelden zum Antworten