Zitat von
tommie-lie:
Zitat von
Rastaman:
Oder kannst du mir sagen warum der Befehl
in den 320x200x256 VGA mode schaltet?
Das kann dir niemand erklären, weil dieser Befehl das nicht tut.
Diese beiden Befehle zusammen tun das, und warum sie das tun, ist einfach erklärt. Der Softwareinterrupt 10 kann zur manipulation der Grafikkarte herangezogen werden. In AH steht der Wert 0, das sagt dem Interrupt-Handler, daß ein neuer Videomodus gesetzt werden soll, in AL steht 0x13, das wird interpretiert als 40Zeilen/25Spalten im Textmodus bzw 320x200 Pixel im Graphikmodus, jeweils mit 256 darstellbaren Farben. Und warum ist das so? Weil die Videomodi irgendwann in der grauen Vorzeit mal festgelegt wurden.
Das was tommie-lie so schön beschrieben hat (Ich hätte es auch nicht besser schreiben können) ist übrigend das Funktionsprinzip fast aller "Funktionen" in
Asm.
Es gibt verschiedene Interupts, die verschiedene Funktionen beinhalten:
z.B.:
Int 10 - Hier sind die "video" (Grafikkarte) Funktionen (vom BIOS bereitgestellt)
Int 13 - Hier sind die "disk I/O services" (vom BIOS bereitgestellt)
Int 21 - Hier sind die "function request services" (von DOS bereitgestellt)
Im Beispielprogramm ist es ja genauso.
[equote="In
http://www.delphipraxis.net/internal...=250060#250060 habe ich folgendes geschrieben:"]...
- Ein Maschinen Programm könnte also wie folgt aussehen:
EB 0C 68 65 6C 6C 6F 20 77 6F 72 6C 64 24 BA 02 01 B4 09 CD 21 B8 01 4C CD 21
Dieses Programm gibt auf dem Bildschirm (in der Dos Box) "hello world" aus
- Es ist natürlich sehr schwer sich die Befehle in dieser Form zu merken, deshalb wurden für die einzelnen Befehle kleine Kürzel (so genannte mnemonische Symbole, kurz Mnemonics)
- EB bedeutet JMP (Jump = Springe nach)
- 0C ist der Parameter von JMP und bedeutet 12 Byte
-> Der 1. Befehl ist also ein "goto 12 Bytes weiter"
- 68 65 6C 6C 6F 20 77 6F 72 6C 64 24 ist die hexadezimale Darstellung von "hello world$" (genau 12 Bytes )
- BA bedeutet MOV DX, Wert
- 02 01 Ist der Wert (Es werden Low und High Byte vertauscht -> Wert = 0102)
-> MOV DX, 102 -> Dieser Befehl speichert den Wert 0102 in dem Register DX des Prozessors ab
- B4 bedeutet MOV AH, Wert
- 09 ist der Wert
-> MOV AH, 09 -> speichert den Wert 09 im Register AH ab
- CD bedeutet INT Wert
- 21 ist der Wert
-> INT 21 -> ruft den Software Interupt 21 auf
-> hier wird die DOS Funktion 09 mit Parameter 102 aufgerufen
-> diese gibt den Text ab Adresse 102 bis zum $ aus
- B8 bedeutet MOV AX, Wert
- 01 4C ist der Wert (Es werden Low und High Byte vertauscht -> Wert = 4C01)
-> MOV AX, 4C01 -> schreibt 4C01 in Register AX
- CD bedeutet INT Wert
- 21 ist der Wert
-> INT 21 -> ruft den Software Interupt 21 auf
-> hier wird die DOS Funktion 4C 01 aufgerufen
-> diese beendet das Programm
- hier noch mal das ganze Listing:
Code:
125A:0100 EB0C JMP 010E
125A:0102 68656C6C6F20
DB "hello "
125A:0108 776F726C6424
DB "world$"
125A:010E BA0201 MOV DX,0102
125A:0111 B409 MOV AH,09
125A:0113 CD21 INT 21
125A:0115 B8014C MOV AX,4C01
125A:0118 CD21 INT 21
[/equote]
Ich habe die Wichtige Stelle oben im Zitat des Tutorials mal rot markiert
Hier noch mal das ganze Listing mit Kommentaren zu den Funktionsaufrufen:
Code:
125A:0100 EB0C JMP 010E
125A:0102 68656C6C6F20
DB "hello "
125A:0108 776F726C6424
DB "world$"
125A:010E BA0201 MOV DX,0102 ; Parameter (Adresse des Strings)
125A:0111 B409 MOV AH,09 ; Dos Funktion No 09 aufrufen (String Ausgabe)
125A:0113 CD21 INT 21 ; In Interupt wird dann obige Funktion ausgeführt
125A:0115 B8014C MOV AX,4C01 ; Dos Funktion 4C mit Parameter 01 wird aufgerufen (Programmende)
125A:0118 CD21 INT 21 ; In Interupt wird dann obige Funktion ausgeführt
Zitat:
INT 21,9 - Print String
AH = 09
DS
X = pointer to string ending in "$"
returns nothing
- outputs character string to STDOUT up to "$"
- backspace is treated as non-destructive
- if ~Ctrl-Break~ is detected, ~INT 23~ is executed
Zitat:
INT 21,4C - Terminate Process With Return Code
AH = 4C
AL = return code (for batch files)
returns nothing
- approved method of program termination
- restores the terminate, ~Ctrl-Break~, and critical error exit
addresses, flushes all buffers, frees memory and returns to
DOS via the termination handler address
- does not close FCBs
- this function is not supported in versions of DOS before 2.x,
so use ~INT 21,0~ or ~INT 20~ to exit.
- see also ~INT 27~ ~INT 21,31~
So funktionierte das damals.
Es gibt Listen mit allen Funktionen der Interupts:
Meine damals verwendete Liste habe ich auf die schnelle nicht mehr gefunden.
Aber hier ist eine andere Liste (ist eigentlich eine Hilfedatei für HelpPC, kann aber auch so gelesen werden):
http://www.arl.wustl.edu/~lockwood/c...errup.txt.html
Zitat von
tommie-lie:
Zitat von
Olli:
Dann hattest du ja nur halb so viel Spaß wie ich
Was ich viel lustiger finde, ist:
Das Thema wurde am 13.10.2004 erzeugt.
am 14.10.2004 habe ich das mini Tutorial geschrieben, dass auch in Tutorials gepostet ist.
am 15.10.2004 war die Diskussion beendet
am 20.10.2005 also gestern also 1 Jahr und 5 Tage später stellt Dussel eine Frage und sofort (ich meine im Millisekundenbereich
) ist diese Disskusion wieder am leben.
Das finde ich immer wieder lustig