Sprung zu absoluter Adresse; Durch den Speicher hangeln?



  • Hi Leute, brauche mal kurz hier etwas Nachhilfe, hoffe das ist das richtige Forum.

    Also angenommen ich habe einen RISC Prozessor, 32Bit Daten&Adressbreite, 120 Opcodes und 32 Register.

    Ich befinde mich an Speicherzelle 2^25 und möchte mit möglichst wenigen Sprungbefehlen (zur Auswahl stehen ein unbedingter Jump und ein bedingter Branch Befehl) an die Position 227+221 springen.
    Der Jump Befehl besteht nur aus 7 Bit Opcode und dem Rest (also 25Bit) für die Zieladresse. Der Befehl ersetzt die relevanten Bits im Program Counter durch die Zieladresse. Hinzu kommen durch das Wortweise alignment 2 weitere Bits.
    Der Branch benötigt daneben noch zwei weitere Felder für die zu vergleichenden Register á 5 Bit. Also 15 Bit effektiv für den relativen Sprung.

    Also ich fange mal an und beschreibe zwischendurch mein Problem.

    2^25=10000000000000000000000000
    

    Der Jump kann durchs alignment 27 Bits springen. Also 25 Bits auf 1, die zwei niederwertigesten auf 0:

    111111111111111111111111100=134217724
    

    Das sind 3 Bits weniger, als 2^27. Das klingt logisch. Mehr adressierbar ist jetzt erstmal nicht.

    Ich bin also fast an 2^27. Jetzt kann ich nicht nochmal per Jump springen, es sind ja schon alle möglichen Bits auf 1. Wenn ich jetzt relativ +4 Springe bin ich auf

    2^27=1000000000000000000000000000
    

    Also eine Bitstelle mehr. Wie komme ich jetzt 2^21 Stellen weiter? Kann ich jetzt per Jump wieder weiterspringen, weil quasi die Möglichkeit habe, die ganzen Nullen wieder auf 1 zu setzen?
    Also maximal wieder

    1111111111111111111111111100=268435452
    

    Damit bin ich über 227+221 drüber und kann damit mit 2 unbedingten Jump sowie einem Branch mein Sprungziel erreichen. Stimmt das?

    Funktioniert das mit dem durchhangeln so? Kann ich schon vorher sagen, wie viele Jumps ich brauchen werde? Das erreichbare Ziel verdoppelt sich ja quasi, je weiter ich mich durch das Programm hangele, oder?

    Danke & viele Grüße

    edit: sehe ich das richtig, dass es in diesem Fall überhaupt keinen Unterschied macht, ob ich bei 2^25 oder bei 0 anfange? Weil es werden ja die 25 Bits so oder so auf 1 gesetzt?



  • Das ganze hängt auch von den Möglichkeiten des Prozessors und dem Speichermanagement usw. ab.

    Empfehlen würde ich zumindest mal, das ganze etwas übersichtlicher aufzuschreiben.

    Also bei 32bit Adressbreite hast du 1111 1111 1111 1111 1111 1111 1111 1111 zur Verfügung.

    Bei 8 Bit, also 0000 0000 kannst du, sagen wir mal mit Opcode F0h oder FFh mehrmals bis zu 1111b auf max Adresse draufaddieren. Jetzt ist noch die Frage, wie du die 1111 interpretieren willst. Alle Adressen ab 1000 könnten ja z.B. negativ sein.


Anmelden zum Antworten