Forum: PC-Programmierung Assembler: Zugriff auf einzelne Bytes


von Stefan F. (stefanf)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

mit schieben kannst du auch an die einzelnen Bytes ran

mov ax , 1234h
mov cl,8
shr ax,cl
mov bh,al

von Inge (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von stephan_ (Gast)


Lesenswert?

und was ist mit AND und OR, das gibt es doch bei jedem Prozessor ???

von (prx) A. K. (prx)


Lesenswert?

Da fehlen dann aber ein paar Bytes. Ausser wenn's ein 8-Bit Prozessor 
mit 8-Bit Registern ist ;-).

von oszi40 (Gast)


Angehängte Dateien:

Lesenswert?

Z80-Bitmanipulationsbefehle siehe auch Kieser-Meder

von Inge (Gast)


Lesenswert?

@ 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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Inge (Gast)


Lesenswert?

>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.

von (prx) A. K. (prx)


Lesenswert?

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
Noch kein Account? Hier anmelden.