Bin Anfänger ein paar Frage zu Register



  • ich hab hier ein Textausschnitt von Assemblertut:
    Da ein Register ja nur 16 Bit hat, haben wir nur 2 hoch 16, also 64 KB, zur Adressierung zur Verfügung. Die Adressierung des Datenbusses hat aber 20 Bit. Das sind 2 hoch 20, also 1 MB. Befinden wir uns im "Real Mode", wie es z.B. unter DOS (nicht mit der Eingabeaufforderung in Windows verwechseln) ist, können wir die Adresse als 16 Bit Wert angeben. Unter Windows befinden wir uns jedoch nicht im "Real Mode" und müssen eine 20 Bit Adresse übergeben. Wie machen wir das denn nun? Der Speicher wird nun in 65.536 Paragraphen (Abschnitte) unterteilt, mit einer Größe von jeweils 16 Bit (64 KB). Die Paragraphenadresse gibt ein Segment an und eine Stelle im Segment nennt man "Offset Adresse". Die Adresse wird immer im folgenden Format angegeben: Segmentadresse:Offsetadresse
    Diese Adresse bezeichnet man nun als "Logische Adresse". Der Computer rechnet diese immer in die Physikalische Adresse um. Man multipliziert einfach die Segmentadresse mit 16 und zählt die Offsetadresse hinzu.

    was ich nicht verstehen kann, ist ein Register hat 16 Bit, wo kommt die Zahl 2 her? ein 16Bit Register kann doch nicht 64KB daten aufnehmen, kann mir das jemand aufklären, wäre ganz schön lieb, thx in vorraus



  • JnZn558 schrieb:

    was ich nicht verstehen kann, ist ein Register hat 16 Bit, wo kommt die Zahl 2 her?

    Ein Bit kann 2 Zustände haben, 0 oder 1. Damit kann ein 16-Bit-Register insgesamt 2^16 = 65536 Zustände haben.

    ein 16Bit Register kann doch nicht 64KB daten aufnehmen, kann mir das jemand aufklären, wäre ganz schön lieb, thx in v******

    Sagt ja gar keiner. Es geht um Speicheradressierung.


  • Mod

    dieses tutorial ist ganz grosser blödsinn...

    im real modus - also unter dos ohne emm386 - stehen 2^20 = 1MB speicher zur verfügung (wenn wir mal HMA ignorieren...). da register nur 16bit breit sind (wenn wir 16bit programmieren...), werden 2 register bzw. konstanten für eine vollständige adresse benötigt: ein segment und ein offset, die effektive adresse ergibt sich dabei als segment*16+offset. das segment wird durch eines der 4 segmentregister bestimmt, operationen, die den speicher benutzen, benutzen gewöhnlich das datensegment (DS), wenn nichts anderes spezifiziert wird (ausnahme: stackoperation push/pop benutzen stets ss:sp, adressen, die bp-relativ sind, nutzen ebenfalls den stack per default). der code wird stets in cs:ip ausgeführt, wobei ip ein verstecktes register ist - sein inhalt kann nur indirekt bestimmt werden; cs kann nur gelesen werden - mov cs, xyz ist also verboten (#UD), dafür gibt es jump/call/ret. stringoperationen benutzen ds:si und es:di, wobei das ds segment durch ein anderes ersetzt werden kann.
    es gibt also viele möglichkeiten, eine bestimmte adresse zu realisieren, da sich die segmente überlappen, innerhalb EINES segments stehen jeweils 64KB zur verfügung.

    im protected mode sieht das alles völlig anders aus - allerdings erscheint der speicher unter windows für gewöhnlich (nicht zwingend, und mit AWE sowieso nicht) als flacher 4GB adressraum.



  • Hi

    trit das tut in die Tonne. Der herr der das "verbrochen" hat, hat selber keine richtige ahnung was er da verzapfth. Im realmode(DOS) lassen sich sehr wohl 1MB (20bit adressen) adressieren. Zwar mit Segment:Offset adressen ( entsprechend verrechnet) aber es geht. Im Protected mode dagegen sind das 32 bit für die adresse was die genanten 4GB macht.

    Im realmode sind die adressen immer physikalische. geht nicht anders. der PC rechnet da nix um. Im ProtectedMode hingegen kann der Prozessor die Logische adresse in eine Physikalische umrechnen ( was normalerweise auch von den Betriebsystemen genutzt wird )

    Auserdem drückt sich der herr nicht gerade eindeutig aus. Es liese sich einfacher und verständlicher formulieren.

    Da ein Register ja nur 16 Bit hat, lassen sich nur 2 hoch 16 Byte (65536Byte, 64kB ) Adressieren. Im RealMode werden aber 20Bit Adressen verwendet. Das ergibt einen maxal zu Addressierenden Speicherbereich von 2 hoch 20Byts (1024*1024Byte = 1MB). Um jetzt trotztdem den vollen speicherbereich adressieren zu können werden 2 16bit register verwendet, Segment und Offset. ......

    gruss Glisglis



  • Man sollte sich, wenn man Assembler lernen möchte, auch mal im Klaren sein, ob man DOS-Programme komplett in Assembler schreiben will (16 bit mode) oder eher nur einzelne C-Funktionen besonders gut optimieren - dafür empfiehlt sich dann eher Windows oder Linux (32 oder 64 bit mode)

    Man kann natürlich auch ein DOS-Programm in C mit Assemblerroutinen aufpeppen oder ein komplettes Windows- oder Linux-EXE in Assembler schreiben, beides ist aber eher unüblich.



  • das stammt doch aus diesem peschko-tut, oder??? ich konnte mit dem tut auch nich viel anfangen. vielleicht solltet ihr in der faq erwähnen, dass dieses tut event. zu verständnisschwierigkeiten führen kann ? 😉


Anmelden zum Antworten