Mit Int 13h Sektor von Diskette einlesen
-
Hallo an alle,
ich übe mich in Assembler und versuche mithilfe des Int 13h und Funktion 02h einen Sektor einer Diskette einzulesen.
Laut Dokumentation wird das Ergebnis des Interrupts an
es:bx
gespeichert, allerdings verstehe ich nicht, wie man damit umgehen muss, damit das Ergebnis in eine Variable gespeichert werden kann.
Bitte um Rat
Gast_34
-
ES ist ein Segment und BX eine Adresse in diesem Segment.
Dein Auslesen hat bewirkt, daß deine xyz Bytes von der Diskette irgendwo in den RAM geschrieben wurden.wenn du jetzt beispielsweise sowas machst, wie (hoffe mal, daß ich das noch halbwegs auf die Reihe bekomme)
mov ds, es ; Datensegment auf den Datenpuffer setzen mov es, 0a000 mov di, 0 ; Bildschirmspeicher vorbereiten mov cx, 0xff ; 256 Bytes werden ausgegeben myloop: mov ax, [ds:bx] ; hier bin ich mir grad garnicht so sicher, ob das ging.. STOSB ; Den Buffer ausgeben inc bx ; und den Zeiger verschieben dec cx jnz myloop
Wie gesagt, ich hab jahrelang kein x86-Assembler programmiert..
-
Macht ja nichts, dafür sind ja so geeks wie meiner einer da...
...um dir deine Fehler gleich schön unter die Nase zu reiben.Mal sehen:
mov ds, es[/asm Geht nicht. Du kannst nur Allzweck-Register oder Werte aus dem Speicher in Segmentregister kopieren. Genauso, wie du Segmentregister nur in Allzweckregister oder den Speicher kopieren kannst. ;) Machst du [asm]mov ax, es mov ds, ax
mov es, 0a000
Mal abgesehen davon, dass hier ein 0x oder h fehlt - dito.
Machst dumov ax, 0A000h mov es, ax
Nun zur Schleife...
mov ax, [ds:bx]
Gehen tut das so zwar schon - macht aber nicht wirklich viel Sinn, wenn du danach nur ein Byte nach es:di schiebst.
Wenn du außerdem ES schon nach DS kopierst, könntest du auch gleich noch bx nach si kopieren. Dann kannst du dir nämlich das ganze Konstrukt sparen und stattdessen einfachrep movsb
schreiben.
-
Danke für eure Antworten!
Ich bin zwar jetzt etwas verwirrt, aber wenn man beide Antworten zusammenfügt, käme das dabei heraus?mov ax, es ; Datensegment auf den Datenpuffer setzen mov ds, ax mov es, 0A000h mov di, 0 ; Bildschirmspeicher vorbereiten mov cx, 200h ; 512 Bytes werden ausgegeben (bitte korrigieren;)) rep movsb
Und wie kann ich jetzt die Daten in eine Variable db o. ä. speichern?
Danke!
Gast_34
-
na also, du geek..
Ich bin halt schon so zwei oder drei Jahre raus, aber nen paar Fehler hätte ich auch wirklich selber finden können..bin halt nicht mehr der jüngste
-
Hi Gast_34.
Vom Gedanken der typisierten Variable, so wie sie in Hochsprachen gebraucht wird, solltest du dich beim Assemblerprogrammieren erstmal ganz schnell verabschieden. Da gibt es naemlich nur Register und den Speicher - damit kannst du im Grunde machen was du willst.
Wenn du wirklich Assembler lernen willst, kann ich dir nur die Tutorials in den Assembler FAQ empfehlen. Da wird zwar nicht explizit auf dein Problem mit den Diskettensektoren eingegangen, aber wenn du die Grundlagen erstmal verstanden hast, kannst du dir deine Frage mit Sicherheit leicht selbst beantworten.
-
Danke für eure Antworten!
Na klar, dass Assembler-Variablen nicht wie Hochsprachenvariablen gebraucht werden sollten, doch wie wäre es sonst möglich, wirklich viel Speicher, auch Konstanten unterzubringen? Andauernd bei einem MB Speicher auf den Stack zu pushen und dann wieder zurückzuholen, ist meiner Meinung nach um einiges unpraktischer als alles in einer schönen db, dw oder sonstwas-Variable unterzubringen. Obendrein erscheint mir das auch viel übersichtlicher. Natürlich wäre im Protected Mode quasi unendlich viel Speicher verfügbar, doch der ist mir eine Nummer zu hoch
Bye, Gast_34
-
Gast_34 schrieb:
Na klar, dass Assembler-Variablen nicht wie Hochsprachenvariablen gebraucht werden sollten,[...]
Wunderbar. Und bis hierhin glaube ich sogar alles halbwegs richtig verstanden zu haben, doch dann wird's ein wenig undurchsichtig:
Gast_34 schrieb:
doch wie wäre es sonst möglich, wirklich viel Speicher, auch Konstanten unterzubringen?
?
Um Daten im Speicher abzulegen, brauchst du keine "Variablen". In diesem Fall braucht's nur eine Adresse.Gast_34 schrieb:
Andauernd bei einem MB Speicher auf den Stack zu pushen und dann wieder zurückzuholen,[...]
???
Welches "MB Speicher"? Was hat das mit dem Stack zu tun? Es zwingt dich doch niemand mittels push und pop auf den Stack zuzugreifen. Letztendlich wird die Stackspitze auch nur durch einen Zeiger markiert - ansonsten liegen die Stack-Daten ganz normal im RAM wie alle anderen Daten deines Programms auch. Du kannst also auf den Stackspeicher (wie auf die anderen Datenbereiche auch) frei zugreifen.Gast_34 schrieb:
ist meiner Meinung nach um einiges unpraktischer als alles in einer schönen db, dw oder sonstwas-Variable unterzubringen.
??!!
Vielleicht waere es mal interessant zu erfahren, was genau du dir ueberhaupt unter diesen ominoesen "db, dw oder sontwas-Variable"n vorstellst.Gast_34 schrieb:
Natürlich wäre im Protected Mode quasi unendlich viel Speicher verfügbar,[...]
Was fuer Dinge?
Quasi kann ein 686 32Bit mit tollen Trix AFAIR 48GByte (?) adressieren - normal nur 4.Gast_34 schrieb:
doch der ist mir eine Nummer zu hoch
So leid es mir tut, ich kann mich nur wiederholen:
Tu' uns und dir selbst bitte einen Gefallen, indem du eines der Tutorials in der Asm-FAQ durcharbeitest.
Das hier:
C/C++ Forum :: FAQ - Assembler :: ASM TUTORIALS => Intel Syntax Assembler Tutorials => Die mit dem Link
"Assembler - Einführung 1" beginnende Reihe ist sehr aufschlussreich.
-
Danke für den Link, hätt ich sonst nie gefunden...
Ich 'programmiere' (so weit man das so nennen darf) 16 bit, und kann deshalb nur 1 MB adressieren. Daher kommt das MB.
Die 'Variablen' nehme ich daraus, dass ich mit NASM 'Variablen' folgendermaßen deklariere:
Variable db 'String' Variable_2 db 'Variablentext'
Bye, Gast_34