Delphi-PRAXiS
Seite 8 von 10   « Erste     678 910      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Maschinensprache (https://www.delphipraxis.net/31751-maschinensprache.html)

lizardking 20. Okt 2005 22:24

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
In was programmiert man das? In C? Könntest du mir in diesem Fall bitte mal das Makefile oder die Ausgabe von `grep include somefile.c` zukommen lassen?

Kann ich Dir nicht zukommen lassen, da ich die Sourcen nicht mehr besitze. Ist aber auch Latte, kann's ja erklaeren :)

In was man programmiert hab ich ja geschrieben : C. Setup war ein Microcontroller, die Ausgabe lief auf 'nem LC-Display, was ueber I^2C oder SPI angeschlossen war (sorry, bin mir nicht mehr ganz sicher, welches Interface). Das ging komplett ueber den gcc (spezielle Version als Cross-Compiler) ohne irgendwelchen Assembler-Code.

Mag sein, dass es Haarspalterei ist, aber es ist definitiv moeglich ein OS ohne Assembler zu entwickeln. Der sinngemaesse Ausspuch "auch C wird in Maschinensprache uebersetzt und deshalb kann man damit ein OS schreiben" hat schon seine Richtigkeit.
Ausschlaggebend dabei ist die Effizienz. Ich hab bei dem besagten Projekt auch teilweise noch Assembler benutzt. Allerdings nicht, weil es mit C nicht funktioniert haette, sondern weil der Code nicht mehr in den Speicher des Microcontrollers gepasst haette.

MaBuSE 21. Okt 2005 07:19

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Zitat:

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 :mrgreen:
  • 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:DX = 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:

Zitat von tommie-lie
Zitat:

Zitat von Olli
Beim Lesen dieses Themas fiel mir nur eines ein: Aua! :wall: :mrgreen: :mrgreen:

Dann hattest du ja nur halb so viel Spaß wie ich :mrgreen:

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 :mrgreen:

mh166 21. Okt 2005 08:54

Re: Maschinensprache
 
Zitat:

Zitat von MaBuSE
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 :mrgreen:

:shock: Stimmt ja. :lol: Dann würd mich doch mal interessieren was aus unserem Herrn Ich-will-unbedingt-mit-0-und-1-programmieren geworden ist. :stupid: Ob ers irgendwann doch noch eingesehen hat oder ob er noch dabei is, nen Text-Editor zu schreiben? :mrgreen:

mfg, mh166

MaBuSE 21. Okt 2005 09:05

Re: Maschinensprache
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von MaBuSE
Meine damals verwendete Liste habe ich auf die schnelle nicht mehr gefunden.

Wer suchet, der findet :-)

tommie-lie 21. Okt 2005 09:51

Re: Maschinensprache
 
Zitat:

Zitat von Rastaman
Is ja super, aber nich jeder kann so toll ASM wie du, und dahinter stand halt der Kommentar.

Der Kommentar betraf beide Zeilen und die drei Buchstaben wurden nur nicht auf zwei Zeilen verteilt, weil davon ausgegangen wird, daß den Code jemand liest, der weiß, was er da in den Fingern hält ;-)

Zitat:

Zitat von Rastaman
Deine Beschreibung mag einleuchten, trotzdem würd ich im Leben nich darauf kommen :?

Tja, RTFM, dann wüsstest du's auch.

Zitat:

Zitat von lizardking
In was man programmiert hab ich ja geschrieben : C. [...] Das ging komplett ueber den gcc (spezielle Version als Cross-Compiler) ohne irgendwelchen Assembler-Code.

Sehr schön, und welche clib wurde verwendet und in welcher Sprache sind die lowlevel-Funktionen in selbiger geschrieben? printf() wird es je nach Displaygröße vielleicht nicht in einer brauchbaren Form gegeben haben, aber es gab sicherlich Funktionen, die einzelne Pixel des Displays ansteuern konnten (vorrausgesetzt die Matrix ist überschaubar, bei einem hochauflösenden Display macht sogar printf() Sinn). In C befinden sich solche Funktionen meist in Objektdateien, die in das Binary mitgelinkt werden, und nun rate mal, in welcher Sprache die geschrieben sind.

Zitat:

Zitat von MaBuSE
Das was tommie-lie so schön beschrieben hat ist übrigend das Funktionsprinzip fast aller "Funktionen" in Asm.

"Fast aller" ist relativ. In einem Betriebssystem ohne eigene vollständige Laufzeitumgebung vielleicht (DOS), aber CALL und RET dürfte in einem normalen Programm wohl öfter vertreten sein als INT und IRET ;-)

Zitat:

Zitat von MaBuSE
(Ich hätte es auch nicht besser schreiben können)

Danke für die Blumen ;-)

Zitat:

Zitat von MaBuSE
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

Entweder hier oder im Tutorial-Thread hat Nico schon auf Ralf Browns Liste hingewiesen, die ziemlich komplett ist und die immer wieder gerne als Referenz herangezogen wird: http://www.cs.cmu.edu/~ralf/files.html
Dein Link nach arl.wustl.edu funktioniert ürigens bei mir nicht, traceroute bekommt einen Timeout beim 10. Knoten.

Zitat:

Zitat von MaBuSE
Was ich viel lustiger finde, ist:
[...]
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 :mrgreen:

Och, bei diesen Popcorn-Threads ist das doch immer so ;-)


Edit: Noch früh am Morgen... (was bedeutet eigentlich "gegeneben"?)

mh166 21. Okt 2005 10:05

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von lizardking
In was man programmiert hab ich ja geschrieben : C. [...] Das ging komplett ueber den gcc (spezielle Version als Cross-Compiler) ohne irgendwelchen Assembler-Code.

Sehr schön, und welche clib wurde verwendet und in welcher Sprache sind die lowlevel-Funktionen in selbiger geschrieben? printf() wird es je nach Displaygröße vielleicht nicht in einer brauchbaren Form gegeben haben, aber es gab sicherlich Funktionen, die einzelne Pixel des Displays ansteuern konnten (vorrausgesetzt die Matrix ist überschaubar, bei einem hochauflösenden Display macht sogar printf() Sinn). In C befinden sich solche Funktionen meist in Objektdateien, die in das Binary mitgelinkt werden, und nun rate mal, in welcher Sprache die geschrieben sind.

ICh denke mal, dass es ihm nich darum ging, dass man ein OS coden kann, komplett ohne *irgendwo* ASM zu verwenden. Denn das ist - erwießenermaßen - nicht möglich. Ich glaube vielmehr, dass er meint, dass man ein OS coden kann ohne *selber* ASM verwenden zu müssen, d.h. dass es in diesem Sinne durchaus OK is, wenn in irgendner Lib - gezwungenermaßen - ASM verwendet wird.

mfg, mh166

tommie-lie 21. Okt 2005 10:18

Re: Maschinensprache
 
Zitat:

Zitat von mh166
ICh denke mal, dass es ihm nich darum ging, dass man ein OS coden kann, komplett ohne *irgendwo* ASM zu verwenden. Denn das ist - erwießenermaßen - nicht möglich. Ich glaube vielmehr, dass er meint, dass man ein OS coden kann ohne *selber* ASM verwenden zu müssen, d.h. dass es in diesem Sinne durchaus OK is, wenn in irgendner Lib - gezwungenermaßen - ASM verwendet wird.

Klar, mit der Komponente TOperatingSystem kannst du auch in Delphi ein Betriebssystem schreiben :mrgreen:

MaBuSE 21. Okt 2005 10:23

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von MaBuSE
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

Entweder hier oder im Tutorial-Thread hat Nico schon auf Ralf Browns Liste hingewiesen, die ziemlich komplett ist und die immer wieder gerne als Referenz herangezogen wird: http://www.cs.cmu.edu/~ralf/files.html

Das war auch die die ich verwedet habe :-)
In meinem Letztem Beitrag ist die Liste (als >6MByte großes AsciiTextfile) zu finden.
Die hatte vorallem auch die undokumentierten Funktionen aufgelistet. (z.B. die von auf dem System aktiven Viren ;-) )

schöni 21. Okt 2005 10:51

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Klar, mit der Komponente TOperatingSystem kannst du auch in Delphi ein Betriebssystem schreiben

Prinzipiell schon. Aber das müsste dann eher eine Komponentensammling sein, die da wäre:

TPCEmulator -> um den Zielrechner zu simulieren (gibt's mit Boch's als OpenSource)
TBiosChip -> Damit der Rechner weiß, was er nach dem Einschalten als Erstes tun muß
TBootDisk -> mit eingelagertem HexEditor für die Bootsequenz (Zumm Booten des Systems)
TGraphicCard -> Ein Grafikadapter zum Anzeigen der Systemausgaben
TMonitor -> Erst hier wären die Ausgaben wirklich zu sehen
TCDROM -> CD-Laufwerk nur lesen
TCDRW -> CD-Laufwerk mit Brenner
(vielleicht reicht hier im Design auch ne Eigenschaft, die die Art des CD-Laufwerkes beschreibt, als nur Lesen, Lesen/schreiben)
TDVD -> DVD Laufwerk

Das Formular müßte zuerst den PCEmulator aufnehmen, dann folgen die anderen Komponenten, die gemäß der Hardware-Konfiguration über passende Eigenschaften zusammengeschlossen werden. Danach folgt der Software Teil. Dafür müssen geeigete Speicherplätze in den KOmponenten vorhanden sein.

In einer PCEmulator Komponente könnte man die Befehllssätze verschiedene CPU's definieren und als Eigenschaft im OI dann einen auswählen. Wie beschreibt man so einen Befehlssatz? Entweder mit einer Tabelle mit allen möglichen Befehlskombinationen. Oder mit speziellen Beschreibungssprachen, falls es sowas gibt. Intel und AMD müssen ja den Befehlssatz für Ihre CPU's auch irgendwo beschreiben. Und VMWare auch.

Zum Grafikadapter:

Ich kenne VMWare. Dort wünschte ich mir eine Hardwarenähere Simulation meiner physikalischen GK
Praktisch ein Wrappen auf meine echte. Da aber der Grafikadapter in VMWare sehr langsam ist, gehe ich davon aus, das alle Funktionen der GK softwaremäßig perfekt nachgebildet sind, statt dort im Gegensatz zu den übrigen PC Komponenten auf die physikalische GK zurückzugreifen.


Sinnvoll wäre das Ganze schon. Aber wer entwickelt die Komponenten? Dürfte einigen Aufwand bedeuten!

schöni

tommie-lie 21. Okt 2005 11:20

Re: Maschinensprache
 
Zitat:

Zitat von MaBuSE
In meinem Letztem Beitrag ist die Liste (als >6MByte großes AsciiTextfile) zu finden.

http://www.delphi-forum.de/images/smiles/icon_lupe.gif Den Beitrag habe ich glatt ignori^Wübersehen :mrgreen:

Schöni, ich weiß nicht, ob du die Ironie in meinem Beitrag nicht erkannt hast, oder ob ich jetzt deine nicht erkenne. :gruebel:
Komponenten zur Emulation eines Computer sind nicht notwendig, als vollständigen x86-Emulator hat man ja Bochs, wenn das Betriebssystem erstmal funktioniert. Neben TOperatingSystem bräuchte man nur noch TMarketDominance (aus Microsoft-internen Kreisen wurde mit bekannt, daß Microsoft bereits an einer Ableitung dieser Klasse arbeitet, TWorldDominance).

Zitat:

Zitat von schöni
In einer PCEmulator Komponente könnte man die Befehllssätze verschiedenee CPU's definieren und als Eigenschaft im OI dann einen auswählen.

Braucht's nich, der dcc kompiliert eh nur nach IA32. Wenn man die Fließkommaerweiterungen von AMD außen vor lässt reicht ein Pentium4 für alles bisher dagewesene.

Zitat:

Zitat von schöni
Intel und AMD müssen ja den Befehlssatz für Ihre CPU's auch irgendwo beschreiben. Und VMWare auch.

VMware nimmt einfach die physikalisch vorhandene CPU daher, die machen sich gar nicht die Mühe, den Prozessor zu virtualisieren.

Zitat:

Zitat von schöni
Ich kenne VMWare. Dort wünschte ich mir eine Hardwarenähere Simulation meiner physikalischen GK

ACK (man will ja mit normaler Geschwindigkeit mit Managed DirectX rumspielen :zwinker:). Aber Workstation 5 hat ja immerhin eine experimentelle Unterstützung für Direct3D.


Disclaimer: Dieser Beitrag kann nicht unwesentliche Mengen nicht ernstgemeinten Textes enthalten. Der Autodieses Beitrags bittet um Verständnis und schließt sämtliche Rechtsansprüche auf durch Ironie oder Srakasmus entstandene Schäden aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 Uhr.
Seite 8 von 10   « Erste     678 910      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz