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!