DOS 8085 - 16 Bit | Code wird "nur" durchlaufen!?



  • Hallo,
    ich hab ein Problem mit Assembler.Und zwar möchte ich erstmal ein einfaches Programm mit Assembler zum Laufen bringen! Funktioniert soweit auch alles ganz gut,
    doch bei dem Nachrichtenstrom hab ich ein Problem, denn er beendet das Programm direkt wieder nach dem Start.Ich weiss noch, dass es in C++ einen Befehl wie "getch();" etc. gab/gibt. Wie fange ich den Nachrichtenstrom also hier ab? Bin noch absoluter Anfänger in Sachen "Assembler" und würde mich über eine Antwort freuen!
    Mein bisheriger Code sieht so aus:

    bits 16
    org 0x100
    
    segment data
    derText: db 'Das erste Programm$'
    segment code
    
    start:
    mov ax, cs
    mov ds, ax
    
    mov ah, 0x09
    mov dx, derText
    int 0x21
    
    mov ah, 0x01
    int 0x21
    
    mov ax,0x4c00
    int 0x21
    


  • Erstmal ist das kein 8085, sondern 8086-Code (allg. x86). Ein DOS fuer 8085 wirst du so ohne Weiteres wohl auch nicht finden.
    Ansonsten ist dein Problem nicht assemblerspezifisch, sondern ein Problem mit der WinNT-Konsole.
    Laesst sich umgehen, indem du entweder dein Programm statt durch Klicken von der Konsole aus startest, oder den Output umlenkst.
    Um auf Tasteneingabe zu warten kannst du entweder den int 21h, Funktion 1 mehrmals versuchen, oder du benutzt gleich int 16h, Funktion 0...



  • Ok, wie gesagt, bin noch absoluter Anfänger. Auch wenn mir dein Beitrag grad ein bischen Spanisch vorkommt hab ich mich mal dran versucht, scheitere ( 😞 ) aber wieder :

    bits 16
    org 0x100
    
    segment data
    derText: db 'Das erste Programm$'
    segment code
    
    start:
    mov ax, cs
    mov ds, ax
    
    mov ah, 0x09
    mov dx, derText
    int 0x21
    
    mov ah, 0x01
    
    int 21h
    

    Danke!



  • WiredCoder schrieb:

    Auch wenn mir dein Beitrag grad ein bischen Spanisch vorkommt

    Ist ja kein Beinbruch... Auch wenn ich nur genauer erklaeren kann, wenn du genauer nachfragst, bzw. sagst, was du nicht verstanden hast.
    Wegen der 8085 vs. 8086-Konfusion - du hast nicht zufaellig was mit dem Thema Tutorial für 8085 zu tun, oder?

    WiredCoder schrieb:

    hab ich mich mal dran versucht, scheitere ( 😞 ) aber wieder

    Was genau hast du denn versucht, bzw. womit bist du gescheitert?
    Die einzigen Aenderung, die ich in deinem Code feststellen kann, sind die Leerzeile in Z.17 und das Fehlen des int 0x21 Aufrufes mit ax=0x4c00 zum Beenden des Programms (das duerfte so wohl zum Crash des Programms fuehren).



  • du hast nicht zufaellig was mit dem Thema Tutorial für 8085 zu tun, oder?

    Nein.

    Was genau hast du denn versucht, bzw. womit bist du gescheitert?

    Das wüsste ich ja auch gern. Ich weiss eigentlich garnicht was die Zeilen machen, ich wollte erstmal die Konsole ordentlich zum Laufen bringen 😉 und mich dann genauer an den Code machen! Ein Freund meinte, ich sollte mal einen Screenshot hochladen, damit man es deutlicher sieht. Ich hoffe, ich hab auch nichts falsch gemacht, benutze dazu das "Nasm"-Programm.
    Also heir der Screenshot :
    http://www.abload.de/img/asmvqu.jpg
    Entschuldigung wenn das jetzt Blöd rüberkommt, aber ich hab zurzeit noch garkein Plan von dem Code und möchte zurzeit eigentlich nur das er funktioniert und das Konsolenfenster bleibt ;-).



  • Ahso. Dein Problem liegt in der Anordnung der "Segmente".
    Praktisch bewirkt die Einteilung in deinem Programm bei der Umsetzung als flat bin (.com-Datei) genau nichts, genauso das label "start:".
    ... Da .com-Programme auch keinen header haben, der eine Einstiegsadresse definiert, wird beim Starten des Programms dein String (bei derText) als Code ausgefuehrt, einfach da er als erstes in deinem Programm steht -> Crash.

    Versuch es mal so rum (die ganzen Segmente und das Start-Label mal entfernt und ein wenig kommentiert) :

    bits 16
    org 0x100
    
    mov ax, cs
    mov ds, ax          ; cs nach ds (hier nicht noetig, da so wie so schon gleich...)
    
    mov ah, 0x09        ; DOS Funktion 9 - mit "$"-Terminierten String nach stdout
    mov dx, derText     ; Offset des Strings
    int 0x21            ; int 0x21 ruft die DOS-Funktionen auf
    
    mov ah, 0x01        ; DOS Funtion 1 - stdin mit Echo lesen
    int 0x21
    
    xor ax, ax          ; BIOS Funktion 0 - Tastaturpuffer auslesen/auf Taste warten
    int 0x16            ; int 0x16 ruft Tastaturfunktionen des BIOS auf
    
    mov ax,0x4c00       ; DOS Funktion 4c (mit exitcode 0 in al) - Beenden
    int 0x21
    
    derText: db 'Das erste Programm$'
    


  • Nubuo wie soll ich dir nur danken? Hat mir den Einstieg um einiges erleichtert! Vielen Dank nochmal! 👍


Anmelden zum Antworten