Wieso sind im RAM die Werte immer woanders?
hallo. Im dem Video https://youtu.be/FZGugFqdr60?list=PLH2l6uzC4UEW0s7-KewFLBC1D0l6XRfye&t=124
wird erklärt , wie eine CPU Befehle abarbeitet. Was ich aber nicht verstehe , warum die Werte im RAM immer woanders sind?
Also was ich damit meine, ist z.b: In Adresse "0" ist der Befehl: , dass in Register_A der Wert aus der RAM-Adresse "14" stehen soll.
Aber warum macht man das nicht so, dass der Wert der eingetragen werden muss ,noch in der gleichen Adresse steht? Z.B : In Adresse "0" ist der Befehl: , dass in Register_A der Wert 3 stehen soll.
Weil ich meine der Ram weiß doch wo die Zahl steht und der Speicherort kann sich ggf. immer verändern? Wäre das nicht viel effektiver , dass anstatt der Adresse die Zahl die eingetragen werden muss steht?
(Warum also steht nicht schon der Wert der in den Register eingetragen werden muss, in der gleichen Adresse? Warum steht der Wert woanders?)
Ist der Grund der , dass dann "zu wenig Platz" noch in der Adresse vorhanden ist, um noch die Zahl komplett anzuzeigen? (was mich aber sehr wundern würde , weil in einer Adresse ist doch ziemlich viel "Platz", oder?)
Oder ist der Grund mehr , dass man dann eventuell die Zahl noch in nachhinein verändern kann?
es reichen mir sehr kleine und kurze Antworten :)
1 Antwort
immediate: Ein konstanter Wert wird ins Register geladen. Hier kann der Wert Teil des Befehls sein(*)
Speicher: Du möchtest ein beliebigen Wert, z.B. der zuvor aus einer Datei gelesen und dort abgelegt wurde, verwenden, dann wird die Speicheradresse angegeben (benötigt).
(*) Genau genommen ist ein Befehl sowieso mehrere Bytes lang und belegt mehrere Adressen, mitunter sogar in variabler Länge.
Richtig. Wobei wie gesagt heute Opcodes oft 16Bit oder auch mehr haben.
Davon abgesehen ist es auch so, daß man Daten und PRogrammcode trennt.
Und / also verstehe ich das richtig das eine RAM Adresse nur 8 Bit speichern kann und wenn der eine Befehl mehr als 8 Bit benötigt , werden dann mehrere Adressen für den Befehl "hinterlegt".
Und der Grund warum die Werte woanders stehen ist zum größten Teil der , weil halt nicht mehr genug "Platz" vorhanden ist , eine komplett Nummer da jetzt doch zu speichern .
Ja, zumindest ist die Adressierung auf Bytebene heute üblich. Das ist natürlich nicht grundlegend zwingend, prinzipiell wäre auch ein anderes Vorgehen denkbar. (z.B. immer nur 32-Bit Worte zu adressieren).
Befehlssätze haben klassisch (bei RISC insbesondere) eine fixe Wortbreite, z.B. ein 16-Bit Instructionset oder ein 32-Bit Instruction set. So wird dann eben für jede Befehl einemal die entsprechende Anzahl BYtes gelesen.
Bei x86 ist die Befehlslänge variabel, das geht hoch bis 15 Bytes.
Also wenn jetzt z.b. ein Befehl so lautet:
Lade in Register A diesen Wert der an Adresse XY steht
Dann werden z.b die ersten 4 Bits für den Opcode gespeichert und die anderen 4 Bits sind dann für die Adresse wo der Wert denn überhaupt steht.
Und wenn dann die angegebene Adresse (oder auch der Opcode)eine höhere Zahl als 4 Bits hat , wird dann der Befehl um noch eine Adresse "erweitert"
(Und wiegesagt ,den Wert direkt in der ersten Adresse zu speichern ist Sinnlos , weil die Zahlen (eigentlich immer) größer als 4 Bit sind)
Sorry falls ich das schon in der Art geschrieben habe.
Japp, aber wie gesagt, in der Regel wird der Opcode schon mehr als 4 Bits haben, es sei denn Du schaust Dir sowas wie die ersten CPUs überhaupt an. (Oder vielleicht uCs).
ich glaube das ich schon herausgefunden habe undzwar ist ja eine Adresse nur 8 bit groß und in wie im Video erklärt wurde , werden sogar von den 8 bit 4 bit für ein Opcode verwendet, also könnte man dann nur ein Wert von maximal 16 haben , oder?