Forum: PC-Programmierung asm x86 register : was ist das x ?


von Kritical R. (kritical_r)


Lesenswert?

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

von egbert (Gast)


Lesenswert?

Effektive Adresse im "Real Mode" = (CS << 4) | IP

von c-hater (Gast)


Lesenswert?

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?

von Kritical R. (kritical_r)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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...

von guest (Gast)


Lesenswert?

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.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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
Noch kein Account? Hier anmelden.