16 bit Register



  • Man kann die Zahl 70000 in 2 16-Bit-Register aufteilen - der Teil mit den Bits 31..16 kommt in ein Register, der andere Teil 0..15 in das andere Register.

    Viele CPUs haben spezielle Befehle, um dann eine Operation mit zwei solcher "künstlich" zusammengeschalteter Register auszuführen. Diese Operationen sind dann aber in der Regel langsamer als normale Befehle.

    Ansonsten kann die CPU die Operation auch im Speicher ausführen, d.h. sie legt den Wert nicht mehr in Registern ab, sondern an 4 aufeinanderfolgenden Bytes im Speicher. Aber auch dies ist langsamer.

    Andere Wege gibt's nicht.



  • Niklas Cathor
    ha du bist ja ein Käpsele dass du bis ca. 2000000 zählen kannst hätte ich dir
    ehrlich gesagt nicht zugetraut.

    Den Beitrag von Marc++us solltest du dir unbedingt reinziehen



  • Was haltet Ihr davon?

    Die Zahl wird dann abgeschnitten.
    70000 = 10001000101110000 binär
    wenn dann das 17bit abgeschnitten wird,
    ergibt das
    0001000101110000 binär = 4464
    Wer kann mir das erklären???



  • Was gitbs denn da noch groß zu erklären 🙂 Wenn du versuchst eine 17-Bit-Zahl in ein 16-BIt-Register zu stopfen werden nur 16 Bit, nämlich die unteren 16 gespeichert, alles darüber hinaus lässt man einfach weg.



  • Hi Nicklas Cathor!
    Du schreibst

    Wie wir dir bereits ca. 2000000 mal erzählt haben konnte der PC damals nicht mehr in den Registern speichern

    Wo hat man denn sonst die Zahl 70 000 gespeichert.
    Oder konnte man solche Berechnungen garnicht durchführen

    Grüße



  • Das wurde schon weiter oben gesagt. 🙄

    Aber weil ich so nett bin, nochmal zum mitschreiben:
    Es geht nicht direkt.
    Die einzige Methode ist es, das zu "simulieren". Und zwar indem man zwei Register zusammen benutzt. Man sagt einfach, in Register Nr. 1 stehen die unteren 16 Bit von 70000 und in Register Nr. 2 die oberen 16 Bit.

    Schau dir QBASIC an: Welchen Wertebereich hatten die integer? Konnte man die Zahl 70000 darin speichern?

    Wieder zurück zu C++:
    Kannst du heute in irgendeiner ganzzahligen Variable mehr als 2^64 (=zwei 32Bit-Register) speichern?

    Hmmm...
    Vielleicht wartest du auf eine Antwort wie: Fließkommazahlen.
    Die können nämlich viel größere Werte speichern, allerdings auf Kosten der Genauigkeit.

    Beschreib mal genauer, was du wissen willst.
    "Das geht nicht" ist bis jetzt die korrekte Antwort auf deine Fragerei.



  • cd9000 danke für die so ausführliche Antwort.

    Das ist schon möglich dass ich vielleicht meine Frage nicht genau genug
    formuliert habe.
    Auf die Feststellung von mir
    Die Register hätten bis zum 286er Prozessor eine größe von
    16 Bits erst ab dem 386 waren die 32 Bit Register verfügbar.
    lautet deine Antwort
    Zitat

    ... indem man zwei Register zusammen benutzt.

    soweit ist alles klar

    Wie soll ich mir aber das einprägen

    Register Nr. 1 stehen die unteren 16 Bit von 70000 und in Register Nr. 2 die oberen 16 Bit

    .

    nehmen wir an wir die Zahl 80 000 als Beispiel
    1001110001000000 als binär (wie funzt das nun mit oben uns unten)



  • 10011100010000000 ist die Zahl (80000). Du hast bei der Binärdarstellung eine 0 am Ende vergessen.

    ungetestet:

    ; So speichern wir 80000 in 2 Registern ab:
    mov ax, 0000000000000001b ; Die oberen 16 Bit von 80000
    mov dx, 0011100010000000b ; Die unteren 16 Bit "    "
    ; Beim Addieren muss der 2. Summand zu den unteren Bits addiert werden.
    ; Danach muss der Übertrag auf die oberen 16 Bit übertragen werden.
    ; (Das klappt nur mit Summanden < 2^16)
    add dx, 1234
    adc ax, 0
    

    So oder ähnlich würde das gemacht werden, wenn es keine 32-Bit-Register gäbe.

    Vielleicht gibt es auch direkte Assemblerbefehle, die beide Register in einem Rutsch verändern. Die sind mir aber gerade nicht bekannt.



  • Also hat man dem nach damals dieses Verfahren angewendet um z.B eine
    Rechenoperation durchzuführen wie 80 000 + 70 000 = 150 000



  • Tauboga schrieb:

    Also hat man dem nach damals dieses Verfahren angewendet um z.B eine
    Rechenoperation durchzuführen wie 80 000 + 70 000 = 150 000

    Ganz genau, multiplikation wird etwas schwieriger, aber auch in 5 schritten machbar soweit ich erinnere. Und die Division wird vom x86 sowieso in dieser form unterstützt.


Anmelden zum Antworten