8086 Assembler und Forth

Beitrag #7531121 wurde von einem Moderator gelöscht.
OP #7531128
Lesenswert?

AMD64 Prozessoren können zwar 8086 Code ausführen, Das finde ich erstaunlich, weil der 8086 ja ein 16Bit Mikroprozessor ist

https://en.wikipedia.org/wiki/Intel_8086

und der AMD64 ein 64Bit Prozessor. Die Befehle sind im 8086 in überschaubaren 8Bit codiert:
https://en.wikipedia.org/wiki/X86_instruction_listings

In naiver Herangehensweise habe ich auf meinem Intel-I5 mit Ubuntu versucht zu kompilieren

1
yasm -f bin -o sector.bin sector.asm

was das Binärfile tatsächlich erzeugt. Der Versuch der Ausführung schlägt dann aber fehl:

1
chmod +x sector.bin 
2
bash: ./sector.bin: Kann die Binärdatei nicht ausführen: Fehler im Format der Programmdatei

Vorausgesetzt man will es auf einem echten OS laufen lassen, statt bare metal: "This is a FORTH so small it fits in a 512-byte boot sector."

Hier war ich mir eben nicht sicher, ob der "putchar" Interrupt für Windows, Linux oder Bios gilt:

1
putchar:
2
  mov ah,0x0e
3
  cmp al,13
4
  jne .1
5
  int 0x10
6
  mov al,10
7
.1:  int 0x10

( aus https://github.com/fuzzballcat/milliForth/blob/master/sector.asm )

Persönliche Seite #7531136
Lesenswert?

Christoph M. schrieb:

was das Binärfile tatsächlich erzeugt. Der Versuch der Ausführung schlägt dann aber fehl:

Kein Wunder, Linux braucht das korrekte Format, typischerweise ELF. Aber auch im richtigen Format führt Linux keinen 8086 Code aus.

Christoph M. schrieb:

.1: int 0x10

Das ist ein BIOS-Interrupt, den kann man unter einem normalen OS überhaupt nicht aufrufen.

Man kann dieses Forth allerdings sicherlich auch auf AMD64 Assembly portieren, dabei die SYSCALL Instruktion statt INT 10h nutzen, und ein gewöhnliches ELF File produzieren. Das kann man dann ganz normal unter Linux starten. Mit den Headern wird es vermutlich etwas größer als 512 Bytes, aber in den MBR kann man so ein AMD64 ELF File ja sowieso nicht packen.

#7531185
Lesenswert?

Niklas G. schrieb:

Das ist ein BIOS-Interrupt, den kann man unter einem normalen OS überhaupt nicht aufrufen.

Dafür gibt es DOSBox. Darunter kann man das, auch unter Linux.

https://www.dosbox.com/

Es gibt auch eine Variante davon, die im Webbrowser läuft:

https://js-dos.com/v7/build/docs/

Warum man sich ausgerechnet die Write-Only-Sprache Forth in Kombination mit fossilem 16-Bit-x86-Code antut, ist natürlich eine andere Frage, aber manch einer mag vielleicht dieses Gefühl, wenn man sich Nadeln unter die Fingernägel schiebt ...

#7531259
Lesenswert?

Niklas G. schrieb:

Da passiert also kein echter BIOS Interrupt auf der Hardware.

Und? Was ist ein BIOS-Interrupt? Ein Softwareinterrupt. Und was ist das BIOS? Binärcode, der von der CPU ausgeführt wird.

Die Emulation von DOSBox stellt alle BIOS-Softwareschnittstellen zur Verfügung, d.h. sämtliche BIOS-Softwareinterrupts. Sonst könnten all' die DOS-Programme, die darauf laufen sollen, auch nicht funktionieren.

OP #7532021
Lesenswert?

Du kannst auch ein DOS oder FreeDOS von USB Stick booten und dann das .bin ohne Emulator auf einem modernen Rechner laufen lassen.

Sollte es nicht auch mit Qemu laufen? Im Makefile des projects steht folgende Zeile:

1
 qemu-system-i386 -fda sector.bin

Als Ergebnis erhalte ich folgende Mitteilung und das Bild im Anhang.

1
WARNING: Image format was not specified for 'sector.bin' and probing guessed raw.
2
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
3
         Specify the 'raw' format explicitly to remove the restrictions.
Angehängte Dateien:
#7533092
Lesenswert?

Niklas G. schrieb:

Das ist ein BIOS-Interrupt, den kann man unter einem normalen OS überhaupt nicht aufrufen.

Wäre vielleicht gut gewesen, mitzuerklären was hier mit "normalem OS" gemeint sein könnte. ;)

Christoph M. schrieb:

Sollte es nicht auch mit Qemu laufen?

Naja, sollte.. es kommt wohl auch drauf an, welche Bootdiskette man nutzt, bzw. welches DOS. Disketten können kaputt sein, gute Bootdisketten gibt es aber hoffentlich noch, z.B. hatte Bernd Leitenberger eine auf seiner Seite zum Herunterladen im Angebot, wenn ich mich nicht irre.

Die ein oder andere Anleitung lesen, wäre eventuell auch schon hilfreich: https://opensource.com/article/17/10/run-dos-applications-linux

OP #7533179
Lesenswert?

Rbx (rcx) 10.11.2023 14:18

Disketten können kaputt sein, gute Bootdisketten gibt es aber hoffentlich noch,

Ein durchaus interessanter Gedanke, dass virtuelle Bootdisketten kaput sein könnten (der Screenshot im vorigen Post wurde nach dem Aufruf von Q-Emu aus der Kommandozeile auf meinen Ubuntu 22.04 PC gemacht).

#7534142
Lesenswert?

Christoph M. schrieb:

Sollte es nicht auch mit Qemu laufen?

Es läuft doch. Nur dass wegen des Minimalismus jegliche Meldungen fehlen und kein Prompt ausgegeben wird. Gedrückte Tasten werden auf dem Bildschirm angezeigt und nach Enter erfolgt irgendwie eine Reaktion. Allerdings konnte ich keine sinnvolle Ausgabe im Sinne einer Programmierung erreichen. Statt eines Sternchens wird z.B auf die Eingabe von 42 EMIT nur ein Sonderzeichen ausgegeben.

#7536202
Lesenswert?

Abdul K. schrieb:

Mit dem Aufkommen von Unix.

Und dann haben Festplattenhersteller plötzlich andere /Sektorgrößen/ verwendet?

Nee. Echte 4K-Sektoren sind bei Festplatten noch relativ neu, die gibts effektiv erst seit etwa 2010.

Siehe https://en.wikipedia.org/wiki/Advanced_Format

Du meinst das Zusammenfassen von Sektoren als eine logische Verwaltungseinheit (was man unter DOS/Windows & Co. "Cluster" nennt).

Sehr, sehr viele Jahrzehnte früher, als noch MFM- bzw. RLL-Festplatten verwendet wurden, und ein separater Festplattencontroller à la WD1003 die Festplatte angesteuert hat, da war ein Umformatieren der Festplatten mit anderen Sektorgrößen möglich, da die Festplatte selbst "dumm" war und von einer Magnetoberfläche abgsehen nicht mehr zur Verfügung stellte. Solche Festplatten positionierten ihre Köpfe entweder mit Schrittmotoren oder aber Servoinformationen, die von den Nutzdaten getrennt auf eigenen Magnetoberfächen untergebracht waren (wie z.B. ST4096 bzw. ST4144R). FÜr die Sektorierung war der Festplattencontroller zuständig, genau so, wie das auch bei Diskettenlaufwerken üblich war.

Das aber verschwand mit der Verlagerung der Controller in die Festplattenelektronik und der Einführung variabler Sektoranzahlen pro Spur (zone bit recording). Damit fing man recht bald nach Einführung der ersten IDE-Festplatten an, nur die allerersten Modelle nutzten noch eine 1:1-Abbildung von Spur/Kopf/Sektornummern analog zum alten WD1003.

OP #7538330
Lesenswert?

von Mario M. (thelonging) 12.11.2023 09:33

Christoph M. schrieb:

Sollte es nicht auch mit Qemu laufen?

Es läuft doch. Nur dass wegen des Minimalismus jegliche Meldungen fehlen und kein Prompt ausgegeben wird. Gedrückte Tasten werden auf dem Bildschirm angezeigt und nach Enter erfolgt irgendwie eine Reaktion. Allerdings konnte ich keine sinnvolle Ausgabe im Sinne einer Programmierung erreichen. Statt eines Sternchens wird z.B auf die Eingabe von 42 EMIT nur ein Sonderzeichen ausgegeben.

Tatsächlich, Du hast recht. Ich habe es nicht bemerkt, weil es keinerlei Meldung ausgibt. Im Anhang habe ich zum Spaß mal eine Meldung in den Assemblercode eingefügt. Das verlängert natürlich Forth-Code ..

Kompilieren und laufen lassen mit

1
 yasm -f bin -o msector.bin msector.asm
2
 qemu-system-i386 -fda msector.bin

Etwas ungünstig ist, dass qemu mit amerikanischer Tastaturbelegung läuft.

Angehängte Dateien:
#7539594
Lesenswert?

Christoph M. schrieb:

Dann könnte man es auch auf einem aktuellen PC testen.

Vorausgesetzt, daß der noch den "legacy mode"/"CSM" kennt und im "BIOS"-Mode booten kann. Das ist bei neueren PCs selten geworden, die haben 64-Bit-UEFI-Firmware, und das war's dann. Auf so etwas gibt es dann keine 16- und auch keine 32-Bit-Betriebssysteme mehr.

Wenn man auf so etwas "bare metal"-Assemblerprogramme laufen lassen will, müssen die x64-Code enthalten und sich als UEFI-Bootloader verkaufen.

(Dateiname BOOTX64.EFI, Speiherort auf EFI-Partition im Verzeichnis \EFI\BOOT)

Für Ein- und Ausgabefunktionen kann man dann allerdings auf die Funktionen der UEFI-Firmware zugreifen, was was komplett anderes ist, als alte BIOS-Softwareinterrupts aufzurufen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren