Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 10.01.2007, 14:44 Titel: Assembler (MASM für DOS) Zahlen Eingabe und Ausgabe |
|
|
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 |
|
|
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 10.01.2007, 16:48 Titel: |
|
|
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
Ich hoffe ich konnte wenigstens ein bisschen helfen
Gruß,
Paul _________________
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 12.01.2007, 10:50 Titel: |
|
|
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 12.01.2007, 14:15 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 12.01.2007, 14:56 Titel: |
|
|
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 12.01.2007, 15:43 Titel: |
|
|
Vielen Dank. Ja, Fliesskommazahlen gehen ja nicht in ein Register, nur über den Coprozessor _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 12.01.2007, 16:34 Titel: |
|
|
Hi.
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. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 12.01.2007, 16:48 Titel: |
|
|
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 da kommen wahrscheinlich bei einer Rechnung plötzlich Buchstaben als Resultat raus. _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 12.01.2007, 19:53 Titel: |
|
|
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 ) 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
|
Kann man.
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.
c.m.obrecht hat Folgendes geschrieben: |
da kommen wahrscheinlich bei einer Rechnung plötzlich Buchstaben als Resultat raus.
|
Oder Sonderzeichen oder Steuercodes. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 12.01.2007, 21:49 Titel: |
|
|
Ja das ist klar, anders als binär geht ja nicht
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 _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
FreakBasic
Anmeldungsdatum: 19.11.2006 Beiträge: 49
|
Verfasst am: 13.01.2007, 07:26 Titel: MA$M :-( |
|
|
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.
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. |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 13.01.2007, 16:07 Titel: |
|
|
Naja, ich würde ja zum NASM raten.
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 17.01.2007, 14:38 Titel: |
|
|
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
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 17.01.2007, 16:19 Titel: |
|
|
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 17.01.2007, 18:10 Titel: |
|
|
Ja das habe ich schon getan, masm32 hatte ich schon länger. _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.01.2007, 01:53 Titel: |
|
|
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 |
|
|
|