www.mikrocontroller.net

Forum: PC-Programmierung Assembler: Zugriff auf einzelne Bytes


Autor: Stefan F. (stefanf)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit schieben kannst du auch an die einzelnen Bytes ran

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

Autor: Inge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stephan_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was ist mit AND und OR, das gibt es doch bei jedem Prozessor ???

Autor: A. K. (prx)
Datum:

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

Autor: oszi40 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Z80-Bitmanipulationsbefehle siehe auch Kieser-Meder

Autor: Inge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Inge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.