ja ich habe mal, noch bevor ich das buch https://de.wikibooks.org/wiki/Assembler-Programmierung_f%C3%BCr_x86-Prozessoren durch habe, ich bin auf seite 32 ;) mir ein wiki vom bios angeschaut https://www.lowlevel.eu/wiki/Bootloader da steht: "Wenn das BIOS die Kontrolle an den Bootloader übergeben hat, gibt es einige Dinge, die jedes BIOS standardmäßig sicherstellen muss: ... CS:IP ist entweder 0x7C0:0x00 oder 0x00:0x7C00 ..." CS ist doch ein CPU adress register und :IP wird dann wohl die eingestellte adresse sein 1. wie liest man den das x? 2. macht das bios diesen eintrag? im buch steht man kann auf CS nicht direkt zugreifen
Kritical R. schrieb: > CS:IP ist entweder 0x7C0:0x00 oder 0x00:0x7C00 > ..." > > CS ist doch ein CPU adress register und :IP wird dann wohl die > eingestellte adresse sein Beides sind CPU-Register. Wenn du nichtmal das weißt, bist du falsch. > 1. wie liest man den das x? Das "0x" zeigt in C-Notation an, dass es sich um Hexzahlen handelt. Wenn du nichtmal das weißt, bist du falsch. > 2. macht das bios diesen eintrag? Nein, das BIOS macht überhaupt keinen Eintrag. Das lädt nur ein paar Daten auf ein paar Speicheradressen und springt dann dorthin, um sie als Programm interpretiert auszuführen. Kann durchaus funktionieren (wenn die Daten sinnvollen Code darstellen). Ansonsten: Crash mit unvorhersehbarem Ausgang. > im buch steht man kann auf CS nicht > direkt zugreifen Das ist Quatsch. Natürlich kann man das CS-Register (wie jedes andere Segemntregister auch) lesen und auch schreiben. Welches Buch erzählt so einen Schwachsinn? Kann es sein, dass du nur irgendwas falsch verstanden hast?
also im oben erwähntem buch steht: Adressregister CS-, DS-, ES- und SS-Register Eine spezielle Bedeutung unter den Registern haben die Segmentregister CS (Codsegmentregister), DS (Datensegmentregister), ES (Extrasegmentregister) und SS (Stacksegmentregister). Sie bilden im so genannten Real Mode gemeinsam mit dem Offset die physikalische 23 Der Prozessor Adresse. Man kann sie nur dafür nutzen; sie können weder als allgemeine Register benutzt, noch direkt verändert werden. und im nasm schreiben ich auch immer ein "h" für hexadezimal ist doch genau richtig hier oder :D
Kritical R. schrieb: > also im oben erwähntem buch steht: Welches Buch ist das denn nun genau? Weil: Es taugt ganz offensichtlich nix... > Man kann sie nur dafür nutzen; sie können weder als allgemeine > Register benutzt, > noch direkt verändert werden. Davon stimmt bestenfalls nur die erste Hälfte der Aussage. Ja: als allgemeine Register können die Segemntregister tatsächlich nur sehr "unhandlich" verwendet werden. Im Notfall ginge allerdings auch das. Natürlich nur sehr ineffizient, weswegen man eine solche Verwendung vermeiden oder zumindest auf eben auf den "Notfall" beschränken wird... Der zweite Teil der Aussage ist allerdings komplett falsch. Natürlich kann man diese Register direkt und gezielt verändern. Wäre es anders, könnte seit 40 Jahren praktisch keine PC-Software mehr laufen. Also: führe das ominöse Buch der einzigen Bestimmung zu, für die es geeignet ist: wische dir mit seinen Seiten den Arsch ab. Allerdings wirst du vermutlich feststellen, dass es auch für diesen Zweck noch besser geeignetes Material gibt...
Kritical R. schrieb: > und :IP wird dann wohl die > eingestellte adresse sein IP kommt von 'instruction pointer', aber Du kannst ja eh kein Englisch. c-hater schrieb: > Welches Buch ist das denn nun genau? Weil: Es taugt ganz offensichtlich > nix... Hat er doch oben als erstes verlinkt: https://de.wikibooks.org/wiki/Assembler-Programmierung_f%C3%BCr_x86-Prozessoren c-hater schrieb: > Der zweite Teil der Aussage ist allerdings komplett falsch. Natürlich > kann man diese Register direkt und gezielt verändern. So ganz falsch ist das nicht. Das "direkt verändert" bezieht sich wohl auf den nicht vorhandenen OpCode für ein "mov Sreg, imm16". Man kann also keine Werte direkt in ein Segmentregister laden, nur aus einen anderen Register oder von einer Speicheradresse.
Man kann auch dreckigen Code verwenden, sinnbildlich für 16 Bit DOS-Programme und vernachlässigter Reihenfolge der Register (das ist zu lange her, welches zuerst, welches zuletzt weiß ich nicht mehr). push cs push ip pushf iret Oder ein jmp far kann auch direkt in das CS-Register schreiben.
c-hater schrieb: >> Man kann sie nur dafür nutzen; sie können weder als allgemeine >> Register benutzt, >> noch direkt verändert werden. > > Davon stimmt bestenfalls nur die erste Hälfte der Aussage. Ja: als > allgemeine Register können die Segemntregister tatsächlich nur sehr > "unhandlich" verwendet werden. Im Notfall ginge allerdings auch das. > Natürlich nur sehr ineffizient, weswegen man eine solche Verwendung > vermeiden oder zumindest auf eben auf den "Notfall" beschränken wird... > > Der zweite Teil der Aussage ist allerdings komplett falsch. Natürlich > kann man diese Register direkt und gezielt verändern. Nein. Man muss den gewünschten Wert erst in ein reguläres Register laden und dann von dort ins Segmentregister kopieren. Alternativ geht auch der Umweg über den Stack per PUSH/POP.
egbert schrieb: > Effektive Adresse im "Real Mode" = (CS << 4) | IP Nicht "|" oder, sondern "+" plus: 20-Bit-Adresse = (CS << 4) + IP
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.