Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Assembler (MASM für DOS) Zahlen Eingabe und Ausgabe

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 10.01.2007, 13:44    Titel: Assembler (MASM für DOS) Zahlen Eingabe und Ausgabe Antworten mit Zitat

Hallo,

nach Assembler in FreeBASIC sowie MASM32 für Windows beschäftige ich mich mehr mit dem Assembler unter DOS. Habe darüber viel gelesen und Beispiele ausprobiert, ist soweit alles klar nur habe ich etwas Probleme zum etwas ganz eigenes zu erstellen. Und zwar ist in den Büchern dies etwas schlecht dokumentiert; wie kann ich am einfachsten Zahlen eingeben lassen (und augeben), z.B. um in einem Programm etwas zu berechnen? Nur in einem Buch fand ich da explizit Routinen, und zwar einen seitenlangen Code. Als ich damit versuchte 2 unterschiedliche Zahlen einzugeben funktionierte es nicht (habe vermutlich etwas falsch gemacht als ich die Routine 2 mal hintereinander stellte).

Die EIn- und Ausgabe von Buchstaben / Strings ist ja verhältnismässig einfach; geht es für Zahlen nicht auch einigermassen einfach, oder mit einem Interrupt oder so? Die Zahlen sollten entweder im Speicher oder auch einfach in einem Register sein. 32-bit wäre von Vorteil.

Vielen Dank
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 10.01.2007, 15:48    Titel: Antworten mit Zitat

Hi!
Das Problem bzw. der Aufwand bei Zahlen ist die umwandlung vom Binär- ins Dezimalsystem.
Einen Interrupt für sowas ist mir nicht bekannt.

Die Vorgehensweise bei der Umwandlung zur Ausgabe auf dem Bildschirm ist aber eigentlich recht simpel;
Z.B. bei der Zahl 1354:

1354 / 1000 = 1
Rest: 354

354 / 100 = 3
Rest: 54

54 / 10 = 5
Rest 4

4 / 1 = 4

Und dann die Teilergebnisse auf dem Bildschirm ausgeben.
(Der Ascii-Code der jeweiligen Ziffer ist einfach die Ziffer + 48 )

So eine Umwandlung sollte eigentlich ohne sehr großen Aufwand in ASM realisierbar sein.

Bei der Eingabe läuft es ähnlich.
Erstmal 48 von jeder ASCII-Ziffer im String subtrahieren, um die richtigen Zahlen zu erhalten.

Dann einfach diese Werte zusammenrechnen.. Beim Beispiel "1354":
1 * 1000 + 3 * 100 + 5 * 10 + 4 * 1

.. sollte auch ohne Probleme in Asm-Code übertragbar sein zwinkern

Ich hoffe ich konnte wenigstens ein bisschen helfen zwinkern

Gruß,
Paul
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 12.01.2007, 09:50    Titel: Antworten mit Zitat

Hi,
schau dir mal diesen Link an:
http://www.fh-wedel.de/~bek/asm/uebss06.html
dort dann -> Übung 3b: Ein- und Ausgabe von Zahlen mit Hilfe von DOS-Funktionen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 12.01.2007, 13:15    Titel: Antworten mit Zitat

Vielen Dank, hat interessante Beispiele auf der Seite.
Eigenartig eigentlich dass es mit Zahlen doch recht viel Code braucht und Strings so einfach ausgegeben werden können...

geht das auch mit 32bit Registern? (mit 16bit lassen sich ja nur kleine Zahlen ein- ausgeben und kein Fliesskomma).
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 12.01.2007, 13:56    Titel: Antworten mit Zitat

Code:
;Gibt eine Zahl im Dezimalformat auf dem Bildschirm aus
;Parameter: EAX = auszugebende (vorzeichenlose) Zahl
;Ausgabe  : keine
dezimalausgabe PROC
;alle Register sichern, die innerhalb der Prozedur genutzt werden
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX

MOV EBX,10     ;Basis des Dezimalsystems
XOR ECX,ECX    ;Ziffernzaehler
dzausgabe1:
XOR EDX,EDX    ;loeschen fuer Division
DIV EBX        ;EAX / EBX = EDX Rest EAX
PUSH DX        ;Ziffer auf dem Stack merken
INC ECX        ;eine Ziffer mehr
CMP EAX,0      ;testen, ob letzte Ziffer erreicht ist
JNE dzausgabe1

MOV AH,02h  ;DOS-Funktion: Zeichenausgabe
dzausgabe2:
POP DX      ;Ziffer von Stack holen
ADD DL,'0'  ;in den ASCII-Bereich der Ziffern transponieren
INT 21h     ;Ziffer ausgeben
LOOP dzausgabe2

;Register wiederherstellen
POP EDX
POP ECX
POP EBX
POP EAX
RET
dezimalausgabe ENDP

Mit Fliesskomma-Zahlen geht das so aber nicht!
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 12.01.2007, 14:43    Titel: Antworten mit Zitat

Vielen Dank. Ja, Fliesskommazahlen gehen ja nicht in ein Register, nur über den Coprozessor
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 12.01.2007, 15:34    Titel: Antworten mit Zitat

Hi. lächeln
Das Strings so gesehen einfacher zu verarbeiten sind liegt daran, dass dies bereits die ASCII-Zeichen sind, die auch vom Treiber bzw. vom Controller bzw. vom Interrupt zurückgegeben werden. Für die Hardware ist es zum Beispiel egal, welchen Zeichensatz du verwendest. Aus Sicht der Hardware muss _dein_ Programm mit dem "Zeug" umgehen, nicht sie. grinsen
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 12.01.2007, 15:48    Titel: Antworten mit Zitat

Ja natürlich, die binären ASCII-Zeichen müssen nicht mehr umgewandelt werden; jedoch, das übernimmt ja die Hardware (die Grafikkarte oder BIOS wo ist das versteckt)?
Wenn man mit den ASCII-Codes rechnen könnte durchgeknallt da kommen wahrscheinlich bei einer Rechnung plötzlich Buchstaben als Resultat raus.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 12.01.2007, 18:53    Titel: Antworten mit Zitat

c.m.obrecht hat Folgendes geschrieben:

Ja natürlich, die binären ASCII-Zeichen müssen nicht mehr umgewandelt werden; jedoch, das übernimmt ja die Hardware (die Grafikkarte oder BIOS wo ist das versteckt)?

Das Zahlensystem ist egal, intern wird aber binär gerechnet.
Die "Umwandlung", wie du sie nennst, erfolgt im BIOS. Der Tastaturchip (Chip in der Tastatur xD) sendet den Scancode zum Tastaturcontroller (Chip auf'm Mainboard). Dort holt sich der BIOS-Int den hab und wandelt ihn in ein ASCII-Zeichen der amerikanischen Standardbelegung um.
Der DOS-Int 0x21 wandelt diesen ASCII-Code dann imho in die deutschen (oder was auch immer für welche, tut ja hier nix zur Sache happy) Codes um. Das betrifft allerdings nur die Codes >127. Alle Codes <128 sind überall gleich.

c.m.obrecht hat Folgendes geschrieben:

Wenn man mit den ASCII-Codes rechnen könnte durchgeknallt

Kann man. Ja! durchgeknallt
Der Prozessor weiß nicht, dass er mit Buchstaben oder Sonderzeichen oder ähnlichem hantiert. Für ihn sind das alles nur binäre Zahlen. Was der Mensch dann mit diesen Zahlen macht, ist seine Sache. grinsen
c.m.obrecht hat Folgendes geschrieben:

da kommen wahrscheinlich bei einer Rechnung plötzlich Buchstaben als Resultat raus.

Oder Sonderzeichen oder Steuercodes. lachen happy
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 12.01.2007, 20:49    Titel: Antworten mit Zitat

Ja das ist klar, anders als binär geht ja nicht lächeln
Ach so, gehört das zum BIOS. Dachte mir doch wegen den verschiedenen Tastaturlayouts, das Betriebsystem muss dies ja tun. Den int 21 braucht man ja (bewusst) fürs Anzeigen.

Natürlich, wäre soweit praktisch mit den ASCII-Zahlen aber eben, auf die Art kann ja öfters das Setuerzeichen für den beep o.ä. kommen, wie es das geben kann wenn man die Offset-Adresse des Datensegmentes nicht angibt grinsen
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
FreakBasic



Anmeldungsdatum: 19.11.2006
Beiträge: 49

BeitragVerfasst am: 13.01.2007, 06:26    Titel: MA$M :-( Antworten mit Zitat

Zitat:
nach Assembler in FreeBASIC sowie MASM32 für Windows beschäftige ich mich mehr mit dem Assembler unter DOS.


Ein Blick auf www.flatassembler.net waere vom Vorteil. Yahooo!!!!

Zitat:
geht es für Zahlen nicht auch einigermassen einfach, oder mit einem Interrupt oder so?


NEIN. Musst du selber zusammensetzen oder auseinandernehmen, siehe
andere Antworten. Zunge rausstrecken
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 13.01.2007, 15:07    Titel: Antworten mit Zitat

Naja, ich würde ja zum NASM raten. zwinkern
Der is' Syntax-mäßig zwar ein bisschen anders als der originale Intel-Syntax, aber trotzdem sehr einfach und leistungsstark.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 17.01.2007, 13:38    Titel: Antworten mit Zitat

Super, die Beispiele funktionieren; das 32bit geht nicht da mein Assembler keine 32bit kennt, der war mal bei einem Buch dabei, aber ist anscheinend ein etwas alter lächeln

Habe RadASM heruntergeladen, ist reizend wie in VisualBasic Fenster zu entwerfen, doch es lässt sich nicht assemblieren (zeigt mir keinen Grund an). Hat hier das schon jemand benützt?
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 17.01.2007, 15:19    Titel: Antworten mit Zitat

Hi,
RadASM ist eine IDE (Entwicklungsumgebung) für Assembler du musst dir evtl. noch einen Assembler (MASM32) installieren und RadASM den Pfad dahin mitteilen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 17.01.2007, 17:10    Titel: Antworten mit Zitat

Ja das habe ich schon getan, masm32 hatte ich schon länger.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 23.01.2007, 00:53    Titel: Antworten mit Zitat

Habe nun auch ein fertiges Beispiel von RadASM versucht zu starten, es kommt die selbe Meldung wie beim eigenen Programm:

Code:

Executing:
"D:\RadASM\Masm\Projects\AviPlay\AviPlay.exe"
00000002

Make error(s) occured.
Total compile time 32 ms


_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz