Hallo zusammen, in meiner Klausurvorbereitung stellt sich mir folgende Frage: Wie kann mit Assembleranweisungen auf einzelne Bytes von Registern zugegriffen werden, die mehrere Bytes umfassen? Notieren Sie 3 Beispiele! Zwei hab ich mir bereits überlegt: 1) Registerstruktur nutzen push ax mov ax, EFh mov bl, al mov cl, ah pop ax 2) bswap push eax mov eax, 12345678h mov bl, al ; bl: 78 mov bh, ah ; bh: 56 bswap eax ; eax: 78563412 mov cl, ah ; cl: 34 mov ch, al ; ch: 12 pop eax Eine dritte Möglichkeit fällt mir nicht ein. Kann mir jemand nen Tipp geben, vllt. mit nem Beipiel? Vielen Dank schonmal.
mit schieben kannst du auch an die einzelnen Bytes ran mov ax , 1234h mov cl,8 shr ax,cl mov bh,al
Das sind mal wieder Beispiele wofür man Professoren prügeln sollte. Es gibt nur zwei Möglichkeiten. Die eine ist über den Speicher, die andere über Rotation/Schiebung. Bswap ist nicht auf jeder Architektur verfügbar bzw. muss kombiniert werden.
Inge schrieb: > Das sind mal wieder Beispiele wofür man Professoren prügeln sollte. Mal abwarten wer hier wen prügeln sollte... > Es gibt nur zwei Möglichkeiten. Die eine ist über den Speicher, die > andere über Rotation/Schiebung. Und wenn der Prozessor die Bytes im Register unabhängig voneinander ansprechen kann, was beim x86 teilweise der Fall ist, dann haben wir die dritte Variante. Universell ist das natürlich nicht, sondern völlig architekturabhängig. Eine vierte Variante geht über die gelegentlich zu findenden Bitfeld-Extract/Insert Befehle.
und was ist mit AND und OR, das gibt es doch bei jedem Prozessor ???
Da fehlen dann aber ein paar Bytes. Ausser wenn's ein 8-Bit Prozessor mit 8-Bit Registern ist ;-).
@ A. K.
ich bezog mich auf den x86.
>was beim x86 teilweise der Fall ist
Eben, teilweise!
Es gibt sogar noch viel mehr Befehle (z.b xchg) aber die zwei
Möglichkeiten sind die gängigen. Man kann, wenn man verrückt ist, auch
mit dem div befehl extrahieren. Alles kein Problem.
Inge schrieb: > Es gibt sogar noch viel mehr Befehle (z.b xchg) aber die zwei > Möglichkeiten sind die gängigen. Beim Zugriff auf die nicht als Bytes ansprechbaren Teile eines Registers kommst du mit XCHG auch nicht weiter. Es wird in der Fragestellung auch nur nach verschiedenen Wegen gesucht, nicht nach gängigen Wegen. Auch der Bezug auf x86 ergibt sich aus der Fragestellung nicht, höchstens im nicht genannten Kontext und den präsentieren Beispielen.
>Beim Zugriff auf die nicht als Bytes ansprechbaren Teile eines Registers >kommst du mit XCHG auch nicht weiter. Da hast du mich ja böse erwischt. Mit Bswap kommst du aber auch nicht weiter wenn du 64bit Register (x86) verwendest. Mit Div/Mul schon eher. >Es wird in der Fragestellung auch nur nach verschiedenen Wegen gesucht, >nicht nach gängigen Wegen. Auch der Bezug auf x86 ergibt sich aus der >Fragestellung nicht, höchstens im nicht genannten Kontext und den >präsentieren Beispielen. Ok, ok. Nehmen wir als Beispiel den x86. Bswap ist von der Architektur abhängig und nicht jede CPU unterstützt es.
Inge schrieb: > Ok, ok. Nehmen wir als Beispiel den x86. Bswap ist von der Architektur > abhängig und nicht jede CPU unterstützt es. Können wir uns statt "Architektur" auf "Implementierung" oder "Variante" einigen? Wenn man jedem einzelnen x86 Prozesser eine eigene Architektur zubilligt weil er einen Befehl mehr oder weniger hat, dann verliert der Begriff x86-Architektur etwas an Signifikanz. Es gibt übrigens (non-x86) Architekturen, bei denen die Methode "Speicher" nicht funktioniert. Bei den meisten x86ern der letzten ~15 Jahre ist diese Methode in einer Richtung (merge) zudem horrend ineffizient. Manche x86 hassen die Registermethode - die bei anderen optimal und u.U. weitaus besser als die Shift-Methode ist. Insofern ist es m.E. in der Lehre durchaus zulässig, zuerst die Varianten aufzuzählen, auch solche die eher exotisch erscheinen, und dann ihre Vor/Nachteile zu beleuchten. Die Lehre betrachtet eher Prinzipien als Einzelfälle. Apropos Multiplikation: Beim PIC30 wird ebendiese als effektivste Methode verwendet, ein Registerpaar auf 0 zu setzen. Kommt man auch nicht sofort drauf.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.