Lowlevel
OffZone => Offtopic => Thema gestartet von: bscreator am 11. June 2004, 17:53
-
Hi Leute,
die damaligen älteren Rechner, Intel-8086-Prozessoren, konnten nur im Real-Mode betrieben werden. Hat sich der Real-Mode von damals bis heute irgendwie verändert ? Kann ich THEORETISCH mein Betriebssystem, das noch im Real-Mode läuft, auf den alten 8086-Prozessoren ausführen ?
mfg,
bscreator
-
Sollte eigentlich gehen solange du keine neuartigen Prozessor-Features benutzt. (soweit ich weiß)
-
kommt drauf an.
Du wirst im Real-Mode viel BIOS Interrupts benutzen. Diese könnten sich natürlich mit der Zeit geändert haben.
Viele Funktion des Int 0x13 gab es früher noch nicht.
Vom Prozessor her ist das exakt das selbe wie damals geblieben.
-
Bei den Interrupts sehe ich nicht das größte Problem, da es die wichtigsten Funktionen auch schon in alten BIOS-Versionen gibt (und zur not kann man ja auch das BIOS updaten). Ein größeres Problem sind die Funktionen, die später hinzugekommen sind. Ich meine die Opcodes der CPU und somit auch die Assemblerbefehle. Ein 80186 kann den Code vom 8086 ausführen, aber der 8086 nicht den gesamten Code vom 80186. Also TeeJays Aussage
Vom Prozessor her ist das exakt das selbe wie damals geblieben.
ist nicht ganz richtig. So versteht ein 80186 z.B. shr ax, 4, beim 8086 ist das aber "Invalid Opcode". Sowas gab es damals halt noch nicht. Wenn du aber den Assembler für den 8086er Befehlssatz konfigurierst, dürftest du keine Probleme haben.
-
Musst halt auch bei den Registern aufpassen, der 8086 hat nur 16-Bit-Register (AX, BX...) und keine 32-Bit-Register (EAX, EBX...), außerdem gibt es FS und GS noch gar nicht.
-
Also das shr ax, 4 gibt es soweit ich gelesen habe erst ab dem 386er.
-
Diese shr ax, 4 habe ich aber schon auf einem 186er ohne Fehler am laufen gehabt!
-
hehe im Endeffekt ist das egal.
Wenn der 8086er das nicht versteht, dann ist es halt auch nicht 8086 kompatibel.
Wenn du dich also daran hälst solche Befehle die der 8086 NICHT kennt wegzulassen, dann läuft dein Programm auf jeder Machine.
-
Dass ich keine 32-Bit-Register verwenden kann, ist mir klar (ist ja in jedem Real-Mode so). Naja, ich hab da gerade nen Befehl gesehen, ".8086", der soll den Befehlssatz des 8086-Prozessors aktivieren. Probier geht über studieren...
Nochwas:
Laut mastermesh ist compilierter C-Code dasselbe wie Assemblercode
(Ausgabe 5, Kapitel 3 Kernel-Entwicklung in C (diesmal auf deutsch)).
Laut dem, was ich in meinen Büchern gelesen hab, ist aber C, aus welchen Gründen auch immer, portabler als Assembler. Was ist jetzt richtig ?
-
Beides ist richtig. Der C-Code ist ja nur solange er C-Code ist portierbar. Beim Compilieren wird der C-Code dann zu Assemblercode übersetzt, der zu der jeweiligen Plattform gehört und nicht portabel zu anderen ist, man braucht für jede Plattform einen eigenen C-Compiler, der nur für diese Plattform geschrieben wurde. (Würde ich jetzt mal so sagen).
-
Ums mal klar auszudrücken.
Dein Prozessor versteht nur 0 und 1.
Und es gibt nun bestimmte Befehle die der Prozessor erkennt. Diese Befehle werden durch eine festgelegte Folge von 0 und 1 dargestellt.
Damit man aber als Mensch nicht ganz abdreht und nur 0 und 1 tippen muss, hat man die sog, Mnemonics? erfunden. Das sind einfach kurze Worte die leichter zu verstehen sind wie du 0 und 1.
mov ax, 1
Wird zu einer Folge von 0 und 1 vom Assembler übersetzt. Das kann dann der Prozessor lesen.
Somit schreibt man im Assembler direkt CPU-Befehle.
C-Code ist mehr eine Sprache die stärker an die menschliche Sprache angelehnt ist und daher "leichter" zu lesen ist.
Dieser C-Code wird aber ebenso in CPU-Befehle übersetzt. Sogesehen also in Assemblercode.
Und damit diese übersetzung passieren kann benötigt man einen Compiler. Wie genau ein Compiler nun:
if(x<3)
printf("Hallo");
umsetzt, hängt vom Compiler ab. Es gibt Compiler die diesen C-Code in Assemblercode für Intel/Amd Prozessoren übersetzt. Oder es gibt auch welche die das für Motorola Prozessoren übersetzt.
Beides sind verschiedene Prozessortypen die eigene Befehle in Form von 0 und 1 Folgen verstehen.
-
Danke Leute, jetzt ist alles klar
-
Irgendwie funktioniert der Befehl '.8086' nicht unter NASM (hab ich mir ehrlich gesagt auch fast gedacht).
Hat jemand von euch eine Ahnung, wie man nur den Befehlssatz des 8086 aktiviert (so dass alle neueren Befehle, sprich 80186 usw. deaktiviert werden)?
Gruss,
bscreator
-
Probier mal:
CPU 8086