cin>> in TASM
-
Hallo ich habe folgendes Programm.
.model small .stack 100h .data MSG DB "Eingabe: $" Ausgabe DB 13,10,"Richtig$" .CODE ENTRYPOINT: mov AX,@DATA mov DS,AX mov DX,OFFSET MSG mov AH,09H int 21h Anfang: MOV AH,7H ; sowas wie getchar(); int 21h ; Ausgeben was der User eingeben hat ........ ;Programm beenden Ende: mov AH,4CH int 21h END ENTRYPOINT ENDLetzdens habe ich hier erfahren das
MOV AH,7Hso etwas wie getchar(); in c++ ist.
Nun meine wie wäre das in TASM wenn ma so etwas wie
cin>>machen will.
Und wie kann ich dann ausgeben was der User eingeben hat.
In meinem Tutorial konnte ich leider dazu nichts finden

-
cin ist ein Objekt, das kannst du theoretisch nachbauen (TASM ist ja sogar objektorientiert), der op>> ist ja nur eine Funktion also auch kein Problem, welche einen Parameter übernimmt.
Aber cin macht im Hintergrund so furchtbar viel und komplexes Zeug, dass du das nicht in ASM nachprogrammieren kannst (ich sage hier du nicht, dass es nicht geht). Denn cin liest die Eingabe formatiert, cin kann verschiedene Zustände haben, cin benutzt einen Buffer zum Lesen, beachtet das gesetzte Locale, eventuelle Callbacks, flusht den Puffer von cout, uvm.
-
Mhhhm ok ^^
Aber wie kann man dann z.b. abfragen was der User eingeben hat ?
-
Assembler schrieb:
Letzdens habe ich hier erfahren das
MOV AH,7Hso etwas wie getchar(); in c++ ist.
Das hast du falsch verstanden.
mov ah, 7 macht nichts anderes, als das Register ah:=7 zu setzen. Das hat mit "getchar" o.Ae. nicht viel zu tun.
DOS int 21h, Funktion 7 wartet auf Tasteneingabe auf stdin und macht ein Echo auf stdout und gibt das Gelesene dann zurueck.Assembler schrieb:
Nun meine wie wäre das in TASM wenn ma so etwas wie
cin>>machen will.
Stimme meinem Vorredner zu. In der Form keine gute Idee.
Assembler schrieb:
Und wie kann ich dann ausgeben was der User eingeben hat.
Solche I/O-Sachen sind immer Betriebssystemabhaengig. In DOS gibt man zB. einen "$"-terminierten mit int 21h, Funktion 9 aus.
Assembler schrieb:
Aber wie kann man dann z.b. abfragen was der User eingeben hat ?
Auch DOS bietet dafuer mehrere Funktionen an. Einen String kann man zB. mit int 21h, Funktion 0x0a einlesen lassen (naeheres dazu zB. in einer Interrupt-Liste nachschlagen).
-
Das mit der String Eingabe funktioniert.
Es wird auch etwas ausgeben nur nicht das was ich eingeben habe^^.model small .stack 100h .data MSG DB "Eingabe: $" .CODE ENTRYPOINT: mov AX,@DATA mov DS,AX mov DX,OFFSET MSG mov AH,09H int 21h Anfang: MOV AH,0aH ;string eingeben int 21h jmp Ausgabe Ausgabe: mov dx,0ah ;string ausgeben mov ah,09h int 21h jmp Ende ;Programm beenden Ende: mov AH,4CH int 21h END ENTRYPOINT ENDHier ist meine Ausgabe ....
-
Assembler schrieb:
Das mit der String Eingabe funktioniert.
Es wird auch etwas ausgeben nur nicht das was ich eingeben habe^^
[...]
Hier ist meine Ausgabe ....*lol*

Zuerst sieht mal alles ok aus, bis hier:
MOV AH,0aH ;string eingeben int 21hOehm, ueberleg mal selbst: wohin sollte diese Funktion den eingelesenen String denn packen, bzw. wie sollte sie ihn zurueckgeben?
Ein Blick in eine brauchbare Interrupt-Liste sagt zu int 21h, Funktion 0ah:
AH = 0A
DS:DX = pointer to input buffer of the format:
¦ max ¦ count ¦ BUFFER (N bytes)
¦ ¦ +------ input buffer
¦ +------------ number of characters returned (byte)
+-------------- maximum number of characters to read (byte)
returns nothing
- since strings can be pre-loaded, it is recommended that the
default string be terminated with a CR
- N bytes of data are read from STDIN into buffer+2
- max buffer size is 255, minimum buffer size is 1 byte
- chars up to and including a CR are placed into the buffer
beginning at byte 2; Byte 1 returns the number of chars
placed into the buffer (extended codes take 2 characters)
- DOS editing keys are active during this call
- ~INT 23~ is called if Ctrl-Break or Ctrl-C detected
... wie man sieht, erwartet diese Funktion in ds:dx einen Pointer (dh. praktisch brauchst du idR. nur dx auf das entsprechende Offset zu setzen) auf einen Puffer (/eine Struktur), der 2 Byte-Variablen und ein char-array fuer den eingelesenen String enthaelt. Da du dx allerdings nicht setzt, landet der eingelesene String theoretisch im Daten-Nirvana, praktisch ueberschreibt er wahrscheinlich deine "MSG", bzw. alles was darauf folgt (wahrscheinlich dein code).
Weiter...
jmp Ausgabe Ausgabe: [...] jmp Ende ;Programm beenden Ende:Nicht so sinnvoll...
Was dir wahrscheinlich dann diese lustigen Zeichen auf den Schirm zaubert, ist das hier:
mov dx,0ah ;string ausgeben mov ah,09h int 21hHm, was war hierbei deine Idee? Funktion 9 erwartet in ds:dx einen Pointer auf den String, der ausgegeben werden soll. Bei Offset 0x0a liegt wahrscheinlich das PSP deines Programms. Auf jeden Fall nichts, worauf du dieser Funktion einen Pointer uebergeben wollen wuerdest.
Wenn du deine Eingabe nochmal ausgeben willst, musst du zuerst an das Ende des eingelesenen Strings ein "$" zur Terminierung setzen und dann das Offset dieses Eingabepuffers in dx uebergeben.
Um og. Puffer anzulegen, kannst du entweder am Ende des Datensegments sowas wie
buffer db 256 dup (?)schreiben (reserviert 256 uninitialisierte Bytes) und die Laengen-Variable per mov initialisieren, oder du definierst eben alles schon fix vor.
-
Hallo ich hab das jetzt so versucht aber das klappt auch nicht ...
.model small .stack 100h .data MSG DB "Eingabe: $" buffer DB 256 dup (?) .CODE ENTRYPOINT: mov AX,@DATA mov DS,AX mov DX,OFFSET MSG mov AH,09H int 21h Anfang: MOV AH,0aH ;string eingeben MOV buffer,AH int 21h jmp Ausgabe Ausgabe: mov DX,offset buffer ;string ausgeben mov ah,09h int 21h jmp Ende ;Programm beenden Ende: mov AH,4CH int 21h END ENTRYPOINT END
-
Assembler schrieb:
Hallo ich hab das jetzt so versucht aber das klappt auch nicht ...
Das koennte daran liegen, dass du nur ~30% von dem, was ich in meinem letzten Beitrag geschrieben habe, umgesetzt hast, 1/3 davon leider auch noch falsch.

Nochmal einzeln:
Vor dem Aufrufen des int 21h zum Einlesen des Strings, musst du den Puffer initialisieren. Dh. du musst an die erste Stelle die maximale Laenge des einzulesenden Strings schreiben (s.u.).Weiter:
MOV AH,0aH ;string eingeben MOV buffer,AH int 21h... Lies dir den Ausschnitt der Interruptliste und meine Erklaerung dazu, die ich im letzten Beitrag gepostet habe, bitte nochmal genau durch und ueberlege kurz selbst, was an diesem deinem Code nicht stimmt.
Kleiner Tipp: Was hattest du mit dieser ZeileMOV buffer,AHgenau im Sinn? (Interessiert mich durchaus.)
Praktisch setzt du damit das 1. Byte des Puffers =ah (also 0aH=10 dezimal), dh. wenn du dem int 21h, 0ah noch einen Pointer auf den Puffer uebergeben haettest, wuerden max. 10 Zeichen eingelesen. Aber irgendwie bezweifle ich, dass das deine Absicht war. :pVielleicht solltest du dir nochmal klar machen, dass int 21h (oder welche Nummer auch immer) in Assembler einem Funktionsaufruf entspricht. Die Parameter dafuer stehen beim Aufruf in den Registern.
Wenn etwas unklar ist, kannst du auch gern gezielt fragen.Als naechstes musst du nach diesem Aufruf der "Funktion int 21h, index 0ah" den eingelesenen String noch mit einem "" stoesst.
Die Laenge des eingelesenen Strings (der uebrigens an Offset +2 des Puffers steht, s.u.) steht an Offset +1 des Puffers, und ich gehe davon aus, dass du schon irgendein Anfaengertutorial (siehe FAQ) durchgearbeitet hast, und damit weisst wie indirekte Adressierung via Register funktioniert.
Dann sollte das damit eigentlich kein Problem darstellen.Nochmal zur Ausgabe:
mov DX,offset buffer ;string ausgeben mov ah,09h int 21hWie ich oben bereits sagte: Der eigentliche String faengt beim Offset +2 des Puffers an. Es muesste hier also "mov dx, offset buffer + 2" heissen.
Zuletzt noch:
Die beiden Spruenge zu unmittelbar folgenden Labels sind in den letzten 11 Tagen kein Stueck sinnvoller geworden.
Gemeint ist das hier:jmp Ausgabe Ausgabe: [...] jmp Ende ;Programm beenden Ende:
-
Ich blick da so nicht durch die Tutorials die ich bisher gelesen haben waren zu 90% Müll.
z.b. bei diesem Tutorial bis Seite 27 ist ja noch alles okay.
Da werden einem ja noch ein paar Sachen erklär mhhm naja eigentlich ist es nur 1 Sache und zwar wie man 2 Werte mit eineander vergleichen kann.
Und auf Seite 28 da kommt der mit einem Programm womit man den Inhalt von einem CMOS−RAM sichern kann.
Was soll das für eine Tutorial sein O_o bei den ganzen C++ Tutorials die ich gelesen habe da wird alles vernünftigt erklärt.
Erste Ausgaben , Dann Datentypen , Dann Eingaben, Dann if Abfragen ....
Bei Assembler Hello World, String einlesen umkonvertieren in Zahl Zahl ausgeben -.- ( Hab ich vorhin irgendwo gesehen ).
Sag doch einfach plz wie das geht ...
-
Assembler schrieb:
Ich blick da so nicht durch die Tutorials die ich bisher gelesen haben waren zu 90% Müll.
z.b. bei diesem Tutorial bis Seite 27 ist ja noch alles okay.
Da werden einem ja noch ein paar Sachen erklär mhhm naja eigentlich ist es nur 1 Sache und zwar wie man 2 Werte mit eineander vergleichen kann.
Und auf Seite 28 da kommt der mit einem Programm womit man den Inhalt von einem CMOS−RAM sichern kann.
Was soll das für eine Tutorial sein O_o bei den ganzen C++ Tutorials die ich gelesen habe da wird alles vernünftigt erklärt.
Erste Ausgaben , Dann Datentypen , Dann Eingaben, Dann if Abfragen ....
Tja, kann ich nicht nachvollziehen, da ich nicht mal weiss, von welchen Tutorials du sprichst (In der FAQ haben wir uebrigens auch inige gute Tutorials). Ansonsten ist die Zielsetzung von Assemblertutorials idR. auch eine andere. Da man davon ausgeht, dass die grundlegenden Konzepte wie die genannten "bei den ganzen C++ Tutorials" bereits bekannt sind, geht es eher darum, das Prinzip von Assembler (Zahlensysteme, Mnemonics, etc.) zu vermitteln, als darum, wie man damit im Einzelnen abstrakte Aufgaben wie Ein- und Ausgabe erledigt.
Assembler schrieb:
Sag doch einfach plz wie das geht ...
Oehm, habe ich nun schon 2 mal getan?

Damit ich es also nach dem 3. nicht auch noch ein 4. Mal erklaeren muss: Was hast du an meinen Erklaerungen nicht verstanden, bzw. wie kann ich es so erklaeren, dass du es auch verstehst?
--Obacht: Ein Minimum an Eigeninitiative und (Willen zum) Mitdenken erwarte ich schon... Einfach Programme schreibe ich idR. nur gegen Bezahlung.