www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7 effektive Bitoperationen


Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

nehmen wir mal an, ich habe in Register 10 folgenden Wert:
r10 = 00000000 00000000 00000000 10000000

das achte Bit (128) soll nun dafür verantwortlich sein, dass ein achtes 
Bit in einem anderen Register r9 gesetzt wird. Bereits gesetzte Bits 
sollen nicht beeinflusst werden
r9  = 00000000 00000000 00000000 10001010

ich habe mir sowas wie
CMP r10, r10, lsl #24
vorgestellt, aber das passt ja nicht, da es ja dann immer negativ wird, 
oder?

Es wäre sehr nett, wenn ich dazu ein Beispiel bekommen könnte.

Danke,
Peter

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...habe eben

movs r5, r10, lsl #24 probiert. (r5 wäre dann ein "temporärer-wert").
Das N-Flag des ARM7 scheint dadurch schon mal richtig gesetz zu werden.

r10 = 0x7f --> N-flag 0
r10 = 0x80 --> N-flag 1

Wie bekomme ich dieses Flag nun am geschicktesten in r9 an das achte Bit 
(128) ?

Gruß
Peter

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

habs jetzt so gemacht:

cmp r10, #128          // n-flag?
orrge r9, r9, #128

ist das OK, oder gehts kürzer?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ist das OK, oder gehts kürzer?

Ja, in C hätte ich da 2s für gebraucht.

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
>>ist das OK, oder gehts kürzer?
<zitat sarkasmus="off">
Ja, in C hätte ich da 2s für gebraucht.
</zitat>

??? versteh´ ich nicht :-(
2 Sekunden, um herauszufinden, was zu tun ist, oder?

Naja, C hatte ich ja auch schon für den SID-Player. Allerdings glaube 
ich nicht, dass man das mit C hinbekommt, ohne SRAM (Stack, Variablen 
etc.)

In Assebler siehts momentan so aus, als würde ich den Stack gar nicht 
benötigen. Und ehrlich gesagt find ich es ziemlich spaßig, das in ASM zu 
machen. Desweiteren wird das Finetuning bzgl. Zyklengenauigkeit in ASM 
wahrscheinlich auch mehr Sinn machen. Was ich auch noch sehr überzeugend 
finde: die 6502 Register bekommen bei mir einfach ARM7-Register, die ich 
nicht brauche. Nicht irgendwelche Bytes im SRAM.

Warum ich die nervigen Fragen stelle?
Wenig Erfahrung => nervige Fragen :-)

Es würde mir halt nicht gefallen, mehr Befehle als nötig zu verwenden. 
Irgendwo brauch ich vielleicht mal die Takte, die ich mir an anderen 
Stellen einsparen hätte können. Zum Anderen gibts durchaus auch Dinge, 
die ich noch lernen möchte. Früher z.B. fand ich in anderen Sprachen 
Trinitätsoperatoren etwas total komischen. Heute verwende ich Sie gerne, 
wo es Sinn macht... Genau so denke ich halt bei Arm ASM. Ich würde gerne 
so ziemlich alle Konstrukte kennen, die Sinn machen, um was zu 
erreichen. Nachdem es ein privates nichtkommerzielles Spaßprojekte ist, 
habe ich auch nicht die Anforderung, das alles mit einem bestimmten 
Aufwand abzuschließen. Man muss m.E. nach schon an so vielen Stellen, 
wenn man seine Brötchen verdient Kompromisse, Workarounds etc. eingehen, 
was ich sehr schade finde. Für mich finde ich es sogar cool, wenn der 
Code am Ende durchgänig extrem strikt Formatiert ist. Ich sehe durchaus 
Parallelen zwischen Programmieren und klassischer Handwerkskunst. Für 
mich sollte im besten Fall ein Programm nicht einfach nur 
"runtergerotzt" werden. Aber das führt jetzt zu weit.

Gruß Peter

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

der GCC macht aus
#include <stdint.h>

uint32_t foo(uint32_t a, uint32_t b)
{
  if(a & (1<<7))
    return b | (1<<7);
  else
    return b;
}

uint32_t bar(uint32_t a, uint32_t b)
{
  return b | (a & (1<<7));
}
Disassembly of section .text:

00000000 <foo>:
   0:  e3100080   tst  r0, #128  ; 0x80
   4:  13811080   orrne  r1, r1, #128  ; 0x80
   8:  e1a00001   mov  r0, r1
   c:  e1a0f00e   mov  pc, lr

00000010 <bar>:
  10:  e2000080   and  r0, r0, #128  ; 0x80
  14:  e1810000   orr  r0, r1, r0
  18:  e1a0f00e   mov  pc, lr

Ich schließe daraus mal das, wenn diese Operation mitten im Code steht 
deine, bereits ideale, Lösung dabei rauskommt. Du siehst also da ist 
keinerlei Stackoperation nötig selbst wenn man die Operation in eine 
Funktion auslagert.

Es lohnt sich also auch mal den Compiler auf ein Problem loszulassen und 
dessen Ergebnis zu untersuchen selbst wenn man später in ASM 
programmiert.

Matthias

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

Das ist ein echt guter Tip! Gefält mir :-)

Ich habe mir den Code vom Emulator angesehen, den ich bisher hatte. 
Dabei habe ich halt gesehen, dass viele Variablen im Speicher abgelegt 
wurden. Die Version, die Du hier aufzeigst, gefällt mir sehr gut. Das 
werde ich für die nächsten Abfragen berücksichtigen. Ich denke mal, dass 
die IAR Workbench da bestimmt ähnlich ist wie der GCC... Werde mir auf 
jeden Fall mal ein Le(e)(h)rprojekt anlegen, um solche Tests zu machen.

Gruß
Peter

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.