Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#72

Re: Maschinensprache

  Alt 21. Okt 2005, 08:19
Zitat von tommie-lie:
Zitat von Rastaman:
Oder kannst du mir sagen warum der Befehl
Code:
mov ax, $0013
in den 320x200x256 VGA mode schaltet?
Das kann dir niemand erklären, weil dieser Befehl das nicht tut.
Code:
mov ax, $0013
int $10
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
DSX = 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:
Beim Lesen dieses Themas fiel mir nur eines ein: Aua!
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
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat