PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : INPUT/OUTPUT ???


Mike
26.04.2002, 13:53
Hi,

kleine Frage zwischendurch.

Ich habe einen Quellcode für Input/Output, aber der ist irgendwie nur für .COM Files ausgerichtet.
Also ich schreib ma den Teil meines Sources auf:

mov si , OFFSET contfirst
doc:
mov AL, DS:[SI]
inc SI
or AL, AL
jz donec;
mov BX, 0
mov AH, 0Eh
int 10h
jmp doc;
donec : ;

input:

...HIER SOLL DER INPUT CODE HIN

jmp $ ;


Wie mach ich das ?

Danke für Eure Hilfe

Mike


Felix Kaiser
26.04.2002, 14:59
Du kannst für die Eingabe den BIOS Interrupt 16h benutzen.

AH=00h
INT 16h
Rückgabe: AH=Scancode, AL=Zeichen

AH=01h
INT 16h

Rückgabe: Zero-Flag = gesetzt, keine Taste gedrückt,
Zero-Flag = gelöscht, Rückgabewert wie AH=00h, aber der Code wird nicht aus dem Tastaturpuffer des BIOS gelöscht.

Mike
26.04.2002, 17:16
hmm, das sagt mir leider sehr wenig, ich seh garnicht, wo da was eingegeben wird, und wo es wieder ausgegibt wird...bin halt mega Newbie
Trotzdem danke fürs helfen.-.

Mike

Felix Kaiser
26.04.2002, 20:32
Die Funktion ließt ja auch keine komplette Eingabe, sondern lediglich ein Zeichen von der Tastatur, bzw. einen Tastencode. Den Rest musst du managen. Ausgabe auf den Bildschirm, zwischenspeichern der Eingabe und eventuelle Funktionen zur Bearbeitung der Eingabe (Cursor bewegen, etc.). Wenn du so eine Funktion baust, kommen schon mal ein paar hundert Zeilen Source dazu.

Mike
27.04.2002, 13:32
Das macht ja nichts,
ein Zeichen reicht mir dabei völlig
(spielt es eine Rolle ob Zahl oder
Buchstabe ?)

Aber den Code habe ich nicht verstanden...

AH=00h <-- bewirkt was ?
INT 16h <-- ok der BIOS Interrupt
Rückgabe: AH=Scancode, AL=Zeichen <-- was ist das ?

AH=01h <-- und das ?
INT 16h <-- wieder Interrupt

Rückgabe: Zero-Flag = gesetzt, keine Taste gedrückt,
Zero-Flag = gelöscht, Rückgabewert wie AH=00h, aber der Code wird nicht aus dem Tastaturpuffer des BIOS gelöscht.

/\ (oben) davon hab ich NIX gepeilt also ab Rückgabe: /\

danke für die Hilfe...

Mike

Felix Kaiser
27.04.2002, 15:09
Es ist egal, du kannst mit dem alles abfragen. AH=00 wartet bis der Tastaturpuffer des BIOS einen Tastencode bereit hält, liest diesen dann aus, löscht ihn aus dem Puffer und gibt ihn zurück.

AH=01 liefert den letzten Code aus dem Tastaturpuffer, vorrausgesetzt es ist einer drin. Ansonsten passiert nichts.

Wenn du nur eine Taste brauchst, musst du den Code der Taste wissen, das Zeichen tuts aber auch schon. In AL ist der ASCII Code des Zeichens drin. A ist z.B. 65 oder 0 wäre 48.

Mike
27.04.2002, 15:18
also, mal schaun, was ich gepeilt habe...

wenn ich das richtig verstanden habe,

dann stoppt AH=00 den ASM Code, und wartet auf eine Tastatur eingabe, egal welche...
will ich jetzt, das der User ein &acute;a&acute; eingibt schreib ich dann
AH=65 hin oder wie ?

was meinst Du bei A=01 der &acute;letzte&acute; Code aus dem Tastaturpuffer ??? was ist das ?

Aber cool danke, so langsam peil ich das ganze...*g*

Mike

Mike
27.04.2002, 15:24
oder geht das so:

AH=00
INT 16h
AL=65 <-- fürs &acute;a&acute;


???


Mike

Felix Kaiser
27.04.2002, 15:28
Also mal ganz in der BIOS Materie:
Der vom BIOS belegte IRQ1 reagiert auf Tastatureingaben folgendermaßen:
ScanCode lesen und verarbeiten. Wenn dadurch ein Tastencode entsteht kommt er in den Tastaturpuffer. Dieser fasst bis zu 16 Codes. Die Funktion AH=00h wartet solange bis irgendwas in diesem Puffer drin ist und ließt dann den Code aus, gibt ihn zurück und löscht ihn aus dem Puffer. Ist im Puffer vorher schon was drin gewesen, wird der älteste Code aus dem Puffer gelesen, resultiert und daraus gelöscht. Bei AH=01h wird das Zero-Flag gesetzt wenn der Puffer zum Aufruf leer ist. Ansonsten wird einfach nur der älteste Code aus dem Puffer resultiert. Ergebnis immer in AX.

Und wenn der User ein A eingibt, landet der ScanCode in AH und der Zeichencode vom A in AL. Ein großes A hätte 65, ein kleines a hätte 97 als Zeichencode.

Jetzt musses aber komplett klar sein ;)

Mike
27.04.2002, 17:44
ok. also, hab ich das jetzt gepeilt:

z.B.


AH=00h
INT 16h

; Es wird ein &acute;A&acute; gedrückt

AL

; Gibt &acute;A&acute; auf dem Bildschirm aus

; oder ist das jetzt so:

AX

????

Hab ichs oder net ?

Mike

Mike
27.04.2002, 17:54
also, ich hab das jetzt al so aufgegriffen:

.model tiny
.code
org 100h

START:

mov ah,00h
int 16h

mov ah,01h
int 16h

; ...wie geb ich hier die eingabe aus ???

ENDE:

mov ah,4ch
int 21h

END START

???

Mike

Felix Kaiser
28.04.2002, 01:17
hehe :) ist ein bissl falsch ;)

Du weißt, dass die oberen 8 Bit von AX dem Register AH entsprechen und die unteren 8 Bit dem Register AL? Wenn du mit AH=00h, Int 16h bereits einen Tastencode unabdingbar erhalten hast, brauchst du kein AH=01h, Int 16h mehr, hast den Code ja schon in AX. Wenn du im Beispiel ein A gedrückt hast, hast du in AH den Scancode der Taste A, der immer gleich ist, egal ob klein a oder groß A. In AL ja den Zeichencode. Den kannst du mit AH=0Eh, Int 10h ausgeben, Beispiel:


xor ah,ah
int 16h
push ax
mov ah,0Eh
int 10h
pop ax


Du wartest auf Eingabe, erhälst eine Eingabe, das durch den Code repräsentierte Zeichen wird auf dem Bildschirm ausgegeben, der komplette Tastencode bleibt im Register AX erhalten.

Mike
28.04.2002, 18:09
Asoooo,

jetzt hab ich wieder weniger gepeilt :mauer:

ist xor nicht ein vergleichs operator oder sowas ???
so wie in anderen Programmiersprachen wie C/C++ oder VB ?

Was bewirkt PUSH und was POP ???

Danke

Mike

Felix Kaiser
28.04.2002, 18:17
XOR führt einfach ein exklusives Oder der Bitmasken zweier Werte aus, Beispiel:

00100101
01101011
========
01001110

Ist durch das True (1) / False (0) Prinzip ideal zum Kombinieren von Bedingungen beim Vergleich.

Mit PUSH kannst du einen Wert auf den Stack schieben, mit POP wieder runterholen. Im Beispiel wurde das Register AX auf den Stack &acute;gerettet&acute; und dann wiederhergestellt.

Mike
28.04.2002, 20:05
asooooooooo....
aber jetzt al wieder zur eigentlichen Frage,
ich kann ja auf der Bootdisk keine anderen Dateien drauf machen...Wie schaffe ich es, das ich eine zweite Disk einlegen muss, also0 das er auf eine Eingabe wartet...und die dann COM oder EXE dateien (in C/C++) geschrieben öffnet ?

Das ist eigentlich das was ich brauche...

Aber danke, ich verstehe ASM immer mehr, ist
echt nicht so unlogisch wie ich anfangs dachte.

Mike

Felix Kaiser
28.04.2002, 23:09
Du brauchst keine zweite Diskette, wenn du die Laufwerksinformationen in deinen Bootblock reinbaust. Dann legste die Diskette ein und kopierst unter Windows oder DOS Dateien auf die Diskette.

Und Assembler ist rein logisch, nur halt aufwendig alles und man sollte schon die Befehle nachvollziehen können, was sie bewirken und welche Änderungen sich durch einen Befehl in der CPU und im RAM ergeben oder auch in der Hardware.

Mike
28.04.2002, 23:22
wie meinst du das mit den laufwerksinformationen im boot code ? aber win sagt mir doch, das der datenträger unformatiert ist, ich kann ja garkeine anderen dateien auf die disk laden...

Mike

Felix Kaiser
28.04.2002, 23:39
Der wird als unformatiert gemeldet, weil Windows keine Laufwerksinformationen im ersten Sektor der Diskette gefunden hat. Diese Informationen beschreiben den Aufbau der Formatierung des FAT12 Systems auf der Diskette. Ich kann ja mal ein Beispiel für ne 1.44 MB Floppy raussuchen.

Mike
28.04.2002, 23:40
hey danke, das wäre cool...

Felix Kaiser
28.04.2002, 23:45
.model tiny
.code
.386
org 100h

main: jmp start

db &acute;FOO$$$$$&acute;
db 000h,002h,001h,001h,000h,002h,0E0h,000h,040h,00Bh,0F0h,009h
db 000h,012h,000h,002h
db 11 dup (?)
db 029h,0EEh,016h,061h,038h
db 11 dup (20h)
db &acute;FAT12&acute;
db 020h,020h,020h

start: mov ax,cs
mov ss,ax
mov sp,7BFEh
mov ds,ax
mov si,7C00h
mov ax,70h
mov es,ax
mov di,100h
cld
mov cx,256
rep movsw
mov bp,16
push es
push offset entry
cli
retf
entry: push cs
pop ds
mov si,offset message
cld
mov ah,0Eh
putmsg: lodsb
or al,al
jz short input1
int 10h
jmp short putmsg
input1: xor ah,ah
int 16h
xor dx,dx
int 19h
retf

message db &acute;Hallo, Welt!&acute;,13,10,0

endcode equ $-main
dest db 510-endcode dup (?)
db 055h,0AAh
end main


Das wäre ein kompletter FAT12 Bootsektor, mit FAT12 gerechten Laufwerksinformationen. Der Beispielcode gibt eine Meldung aus, wartet auf Tastendruck und setzt den normalen Bootvorgang fort.

Mike
28.04.2002, 23:50
wie könnte ich jetzt in diesem code eine andere co oder exe datei starten ?

Mike
28.04.2002, 23:52
ich hab das grad a getestet, er sagt immernoch das die disk unformatiert ist...

was jetzt ???

Felix Kaiser
28.04.2002, 23:55
Ach du meine Güte ... Dann müsstest du mit aufwendigen Code in dem FAT12 Dateisystem auf der Diskette nach der Datei suchen, sie laden und dann ausführen lassen. Eine EXE wirst du nicht schaffen, da du wohl kaum in den kleinen Code einen Reallozierer für Adresse reinbekommst, gleich mit Heapmanager für Stackallozierung. Also wenn du so willst, nimm am besten einen MS DOS FAT12 Bootblock und ändere den Dateinamen IO.SYS in den Dateinamen, den du laden lassen willst. Ist das einfachste was geht, weil ansonsten fummelst du ewig bis allein der FAT12 Lese/Ladecode fertig ist. Zumal ich eh keinen funktionierenden mehr da hab.

Mike
28.04.2002, 23:56
und woher sollte ich einen solchen bootblock herbekommen ???

Felix Kaiser
28.04.2002, 23:56
Formatiere die Diskette unter DOS und dann schreibst du den neuen Bootcode nochmal drauf. Dann muss es gehen, oder du hast was falsch gemacht, weil der Code geht.

Mike
28.04.2002, 23:57
ich hab kein dos...nur eingabeaufforderung

Felix Kaiser
29.04.2002, 00:02
Das ist DOS ...

Also, formatiere die Diskette einfach als FAT12, komplett. Dann ließt du den ersten Sektor der Diskette aus, änderst den Dateinamen IO.SYS in deinen und schreibst den wieder auf die Diskette.

Mike
29.04.2002, 00:07
moment ma, langsam,
also disk formatieren als fat12 ??? bei mir steht beim formatieren nur als FAT sonst nix.

und wo steht dann der bootblock mit dieser komischen IO.SYS datei ???

sorry, grad raff ich ma wieder garnix ;-)

Mike

Felix Kaiser
29.04.2002, 15:11
Der Bootblock ist Sektor 0, der erste Sektor auf dem Laufwerk. Solltest du wissen, immerhin schreibst du ja deinen Bootcode auch auf dieselbe Position, nehme ich mal an.

Mike
29.04.2002, 15:18
also in meinem Bootblock oder dem den du mir gegeben hast steht nirgendswo was von IO.SYS...

oder ich bin einfach zu blöd...

Mike

Felix Kaiser
29.04.2002, 15:21
Ja da steht auch nix drin. Aber in dem von DOS / Windows.

Mike
29.04.2002, 15:22
Den habe ich ja nicht ;-)

Sach ma hast Du ICQ oder so ? Ich
glaub das ging ein bisschen schneller
als immer auf eine Antwort im Forum
zu warten...

Mike

Felix Kaiser
29.04.2002, 15:37
Nein, hab ich nicht.

Wie hast du deinen bisherigen Code immer getestet ?

Mike
29.04.2002, 15:38
Naja, erstmal, den Code mittels TASM und TLINK kompiliert, dann mit RAW WRITE auf die disk geschrieben und NEU START !

Mike

Felix Kaiser
29.04.2002, 15:45
Ja genau! Mit RAW WRITE. An die Stelle wo du schreibst, das ließt du halt mal aus, nach dem du die Diskette unter DOS oder Windows oder halt so komplett formatiert hast. Dieselbe Stelle wo RAW WRITE hinschreibt, halt auslesen. Dann hast du den MS DOS Bootcode. Dort ist der Dateiname IO.SYS erwähnt, den kannste einfach ändern in einen eigenen, schreibst den Bootsektor mit RAW WRITE zurück und kannst dann DEINE Datei raufkopieren.

Mike
29.04.2002, 15:53
UND WIE SOLL DAS GEHN ??
Ich mein, ich soll formatieren ?
Dann irgendwas mit RawWrite dann wieder
zurück :mauer: 8o :mauer:

Ich bin durcheinander...

Beschrieb mal Schritt für Schritt...

Mike

Felix Kaiser
29.04.2002, 17:32
Ok :]

1.Diskette einlegen
2.Diskette formatieren
3.Bootsektor auslesen (mit RAW WRITE schreibst du, brauchst halt für diesen Schritt was, was das Gegenteil bewirkt, auslesen und als Datei auf Festplatte speichern)
4.Dateiname im Bootsektor ändern, geht z.B. mit einem Hex Editor
5.Modifizierten Bootsektor mit RAW WRITE zurückschreiben auf die Diskette
6.Du kopierst deine Datei mit dem Code auf die Datei z.B. mit dem DOS Befehl COPY

Jetzt verstanden? :)

Mike
29.04.2002, 17:50
Also ich hab komplett formatiert.
Ich hab dieses RawWrite for Windows...
Damit kann ich auch READ machen.
Das habe ich dann und der hat das gemacht und bei 44% sagt er &quot;Read failed error=23(Datenfehler (CRC-Prüfung))

Tja...hmmmm

was nun =

Mike

Felix Kaiser
29.04.2002, 17:54
44% ?! Der ließt wohl die ganze Diskette aus, hmm, sollte er aber nicht. Und ich glaub jetzt weiß ich welches Tool du verwendest, alles klar ... Gib mal deine Mailaddy, dann maile ich dir mal ein DOS Tool (und bitte auch nur unter DOS benutzen), um RAW Reading und Writing auf gezielte einzelne Sektoren zu machen. Oder halt gleich das innem ZIP was ich da hab. Hab ja solche Basteleien wie du schließlich auch lange genug gemacht, wohl fast zu lange :D

Mike
29.04.2002, 17:57
Hab dir meine Adresse per e-mail geschickt.
An &quot;webmaster@darkenemy.com&quot;

Felix Kaiser
29.04.2002, 18:05
Und die Tools hast du nun ;) Viel Spaß und Glück damit. Muss ja irgendwann mal RICHTIG funktionieren. Und irgendwann hast du dann auch alles notwendige verstanden :)

Mike
29.04.2002, 18:13
Jetzt hab ich diese ABSDISK.OUT Datei, aber die lässt sich mit keinem Programm ordentlich öffnen...wie soll ich denn da was ändern...außerdem ist das doch kein BootRecord oder ? Also, die CD startet doch dann nicht von allein wenn ich neustarte oder ?

Mike

Felix Kaiser
29.04.2002, 18:16
Die CD? Was willste denn jetzt mit einer CD? :)
Ich hab außerdem gesagt, versuchs mal mit nem HexEditor. Damit gehts am besten halt, ist einfach nur binärer Code. Oder soll ich das nun etwa auch noch für dich erledigen? :O

Mike
29.04.2002, 18:16
Also bei ir steht da nur:



ë<MSDOS5.0
ð ~KChNO NAME FAT12 3ɎѼð{ŽÙ¸

..dann noch ganz viel scheiss

NTLDR
NTLDR fehltÿ
Datentr„gerfehlerÿ
Neustart mit beliebiger Taste

Mike
29.04.2002, 18:17
Ja mit CD meinte ich die Diskette *Gg*

Mike
29.04.2002, 18:18
BINÄR CODE ??? OHJE...Aber i BinärCode seh ich ja das IO.SYS Ding garnet, oder ??? :mauer:

Felix Kaiser
29.04.2002, 20:33
Normal schon ?(
Ach komm, sag mir wie deine Datei heißt und ich mach das mal und schick dir den Bootsektor per Mail.
Im MS-DOS Bootsektor wird IO.SYS erwähnt, jedoch gesplittet ins Format 8:3, damit er die besser vergleichen kann, also:

IO SYS

Mit 5 Leerzeichen dazwischen halt.

Mike
29.04.2002, 21:15
Ok ich schickse Dir per e-mail !

Aber wenn Du willst, kanns du mir ja erklären, was genau Du dann damit gemacht hast, ok ;-)

Mike

kinglazee
05.09.2004, 13:25
hallo...

ich bin gerade dabei mir eine Bootfähige CD zu basteln mit der ich Rescue und SYS tools aufrufen kann.

Ich würde gerne wissen was ich mit dieser Sprache beim booten so alles machen kann? Gibt es irgendwo einige Grundlagen dazu?

Im voraus besten Dank.

MFG kinglazee