Hallo zusammen, mein Hobby ist “Programmieren mit Assembler”. Ich habe mir mit NASM ein kleines Programm erstellt, mit dem ich gewisse Speicher-Adressen untersuchen und auch beschreiben kann. Das funktioniert auch mit dem PC (Prozessor Pemtium ® 4) sehr gut. Das Programm läuft im Real-Modus und wird von einer selbst geschriebenen Boot-Rutine mittels USB-Stick gestartet. Wenn ich den Stick in einem Notboock starte, geht das auch, allerdings mit einer Ausnahme: Sobald ich eine Adresse lesen oder beschreiben will, die größer ist als 0x0000FFFF, stürzt mein Programm offensichtlich ab. Meine Frage ist jetzt folgende: Kann man bei einigen Pentium´s den Flat-Memory- Modus ein- und ausschalten ? Wenn ja, wie ? Das Notboock hat laut Bios einen Pentium P6200. Es wäre schön, wenn mir jemand von euch helfen könnte.
Manfred Stark schrieb: > Sobald ich eine > Adresse > lesen oder beschreiben will, die größer ist als 0x0000FFFF, stürzt mein > Programm > offensichtlich ab. > Meine Frage ist jetzt folgende: Kann man bei einigen Pentium´s den > Flat-Memory- > Modus ein- und ausschalten ? Wenn ja, wie ? Stichwort Protected Mode und Paging. https://de.wikipedia.org/wiki/Protected_Mode Im Real Mode musst du dich mit Segmentregister und Offset herumquälen und der maximal adressierbare Speicher ist 2^20, allerdings nicht als Flat Memory.
Manfred Stark schrieb: > lesen oder beschreiben will, die größer ist als 0x0000FFFF, stürzt mein > Programm > offensichtlich ab. Das ist das Ende des ersten Segments - wenn du darüber hinaus schreibst, überschreibst du den Anfang dieses Segments, und da ist dein Programm, klassischer Fall von Selbstzerstörung. Dein Programm wäre nur zu etwas zu gebrauchen wenn es auch das Segmentregister setzen würde. Georg
vielen Dank Georg! Was du sagst, funktioniert natürlich. z.B. mov ax, 0x1000 mov ds, ax mov bx, 0 mov [ds:bx], Byte 0x41 diese Funktion schreibt ein 'A' in die Adresse 0x00010000. damit kann ich bis zu 1 MBytes adressieren. Aber mit meinem Pentium (R) 4 kann ich mit folgendem Code bis zu 4 GBytes adressieren. z.B mov edi, 0xFFFF0000 mov [edi], Byte 0x41 diese Funktion schreibt ein 'A' in die Adresse 0xFFFF0000. Das ist der sogenannte Flat-Memory-Modus. Genau das funktioniert aber bei dem Pentium P6200 nicht. Deshalb vermute ich, dass der Flat-Memory-Modus bei dem P6200 ausgeschaltet ist. Möglicherweise muss dieser nur eingeschaltet werden.
Manfred Stark schrieb: > Kann man bei einigen Pentium´s den Flat-Memory-Modus ein- und ausschalten? Man kann ihn einschalten. Ausschalten ist schon schwieriger, denn zurück geht (oder ging es anfangs) nur über Reset. Was manche nicht daran hinderte, mit OS/2 1.x ein Betriebssystem zu bauen, in dem routinemässig zigmal die Sekunde stattfindet. Alle x86, die für PCs gebaut sind, starten im Real Mode, kompatibel zu Intels 8086/8088. Darin gibts nur 16-Bit Adressierung mit 1MB Limit. Man kann in den Protected Mode wechseln und der Wechsel will gut vorbereitet sein. Im Protected Mode gibts dann ab 386 auch 32-Bit Adressierung, flach oder segmentiert, und ab AMDs K8 gibts noch einen weiteren Modus mit flacher 64-Bit Adressierung. > Möglicherweise muss dieser nur eingeschaltet werden. Das "nur" ist ein recht komplexer Vorgang. Bissel mehr als Bit setzen.
:
Bearbeitet durch User
Wenn du mehr darüber wissen willst, schau dir DOS-Extender an, der bekannteste dürfte DOS4GW sein. Damit war es möglich, protected-mode-Programme unter DOS auszuführen. Falls Du "nur" mehr Speicher brauchst, schau nach XMS. Ich hatte damals(tm) ein Diskcopy-Programm geschrieben, was eine komplette Diskette Sektor für Sektor in den Speicher laden und somit ohne mehrfachen Wechsel kopieren konnte.
(prx) A. K. schrieb: > Alle x86, die für PCs gebaut sind, starten im Real Mode, kompatibel zu > Intels 8086/8088. Darin gibts nur 16-Bit Adressierung mit 1MB Limit. Das stimmt nicht ganz. Bei den 32-Bit-Prozessoren kann man auch im Realmode die 32-bittigen Offset-Register verwenden, um mehr Speicher anzusprechen. Zumindest früher gab es Prozessoren, wo das ging. Ob das bei allen Prozessoren möglich ist, weiß ich nicht. Soweit ich weiß, war das auch nie ein offizielles Feature der Prozessoren. PS: Das nannte sich wohl "unreal mode": https://de.wikipedia.org/wiki/Real_Mode#Unechter_Realmodus_(%E2%80%9EUnreal_Mode%E2%80%9C,_%E2%80%9EBig_Real_Mode%E2%80%9C)
:
Bearbeitet durch User
Das war der sogenannte "Unreal Mode" ab dem 80386, so daß man Zugriffe auf Adressen wie DS:[EBX] ausführen konnte, was im Real Mode zu einer Exception führt. War kein offizielles Feature sondern eher ein Glitch, wurde aber überraschend oft verwendet. Der 80286 kann sowas ähnliches über die ich glaube ebenfalls unoffizielle LoadAll-Anweisung, wobei auch die im Real Mode versteckten Register(teile) beschrieben werden können und dadurch Zugriffe auf erweiterte Speicherbereiche möglich werden.
Das Umschalten des 386 vom Realmode in den protected mode ist eine eher auswendige Sache. Denn nicht nur wird das Memory gepaged, was das aufsetzen der memory management unit bedeutet, sondern es kommen auch Benutzerrechte. Diese nennen sich Ring0, Ring1, Ring2, im Ring0 laeuft das System, resp, der Kernel davon, nicht das GUI, Ring2 sind die Anwenderprogramme. Der Witz davon, Anwenderprogramme duerfen nicht auf das System zugreifen koennen. Und dort wo sie's duerfen steht ein Callgate, da werden die Zugriffen gehandelt. Interrupts gehen nicht einfach auf irgendwelchen Code, sondern ueber ein Trapgate, welch das Handeln. Das Ganze ist ein riesen Overhead, der erst einmal aufgesetzt werden muss. Das Ganze waere moeglicherweise einfach, wenn man auf der gruenen Wiese beginnen koennte. Leider beinhaltet der Realmode schon Fehler, welche von Microsoft in Hardware eingebaut wurden. Heisst die Hardware funktioniert nicht wie's von Intel vorgegeben wurde, sondern anders, von mircosoft vermurkst. Daher muss die Betriebssystem Software diese fehler korrigieren, und der Programmierer muss erst mal die Details herausfinden.
> Leider beinhaltet der Realmode schon Fehler, welche von Microsoft > in Hardware eingebaut wurden. Heisst die Hardware funktioniert nicht > wie's von Intel vorgegeben wurde, sondern anders, von mircosoft > vermurkst. Daher muss die Betriebssystem Software diese fehler > korrigieren, und der Programmierer muss erst mal die Details > herausfinden. Watt is?! Was ich heute empfehlen würde ist, sich mit dem "alten 16Bit-Assembler" gar nicht mehr so sehr zu beschäftigen bzw. nur wenn man es wirklich will oder muss, etwa weil man sich mit einem 8086 einen Ur-PC zusammengelötet hat oder so. Dann lieber gleich mit 32- oder 64Bit-Assembler unter Windows anfangen. Dann hat man von Anfang an das gewünsche flat Speichermodell, die Programme können ohne großen Aufwand auf jedem Rechner ausgeführt werden und man braucht sich um die verhasste Segmentierung nicht mehr zu kümmern. Ich habe das zwar nie als schwer empfunden, aber viele hassen das.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.