mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler: Berechnung des Betrags einer Zahl in 1-Byte-2er Komplementdarstellung


Autor: Assemblerneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, ich hoffe hierbei kann mir jemand helfen:
Ich arbeite mich gerade in die Assemblersprache der PSoC bausteine von 
der Firma Cypress ein und habe bisher so gar keine Erfahrung mit 
Assembler.
Nun muss ich den betrag einer Zahl in 1-Byte-2er-komplementdarstellung 
berechnen und weiß nicht ganz wie.
Ich habe einen Eingabewert in einer Speicherstelle, nennen wir sie 
[adwert] und möchte das Ergebnis an die stelle [erg] haben.

Die assemblerbefehle ver Cypress PSoC bausteine sind, soweit ich das 
beurteilen kann, "standard"befehle, wie sie auch sonst oft vorkommen. 
Ich habe zB befehle wie mov; xor; jmp; jz; tst; add etc..

Ich dachte nun daran, das Byte für die Vorzeichenfallunterscheidung zu 
maskieren, sodass ich nur noch das erste Bit habe - und dann in einer IF 
- ELSE schleife zu verarbeiten. Weiter komme ich momentan aber nicht.

Kann mir da jemand irgendwie helfen? Bestenfalls mit Code? Ich weiß zB 
nicht, wie ich die condition der schleife auslegen soll, geschweige denn 
dann weiter.

Beste Grüße

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich dachte nun daran, das Byte für die Vorzeichenfallunterscheidung
> zu maskieren, sodass ich nur noch das erste Bit habe - und dann in
> einer IF - ELSE schleife zu verarbeiten.
> Weiter komme ich momentan aber nicht.

Bruachst Du nicht:  Du prüfst, ob die Zahl negativ ist (dann ist das 
höchste Bit gesetzt  bzw. nach dem Load / Test ist das N-Flag gesetzt. 
Wenn es nicht gesetzt ist, überspringst Du den folgenden NEG-Befehl - 
fertig.

also etwa so
lda adwert
bpl +1
neg a
weiter gehts


ob der lda die Flags setzt, musst Du selbst schauen, ist von µC zu µC 
unterschiedlich. Wenn nicht, muss noch ein tst a dahinter.


Kann der AD-Wert wirklich negativ werden?  kenne ich nur bei ADC mit 
differentiellem Eingang.

Autor: Assemblerneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dankesehr!
nun habe ich noch folgende fragen:
wie prüfe ich, ob das erste bit gesetzt ist? mit einem größer/kleiner 
vergleich? oder kann ich die bits direkt ansprechen? ich weiß nämlich 
nicht wie..

die lda und bpl (increment?) direktiven kenne ich nicht (und sind auch 
so nicht im assembler handbuch vom psoc zu finden) - welche befehle 
repräsentieren sie denn? neg wird wohl negieren sein, den befehl habe 
ich schon gefunden. aber auch hier: wenn ich meine negative zahl 
negiere, tue ich das ja zwangsweise auch mit dem vorzeichenbit, das dann 
mit in meiner zahl landet.. wie kann ich die heraushalten? oder habe ich 
da etwas falsch verstanden?

besten dank schon einmal! ich bin hier wirklich noch sehr am anfang und 
für jede hilfe dankbar

Autor: Assemblerneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja und was den negativen AD wert angeht - in dem versuchsaufbau den 
ich hier bearbeite scheint er zu können.

Autor: Assemblerneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin ich unverständlich oder sind die fragen nur zu einfach?
need help

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer mit der Ruhe, Kollege.

> wie prüfe ich, ob das erste bit gesetzt ist?

Kommt auf den Befehlsatz an, den ich nicht kenne. Du musst halt im 
Handbuch schauen, ob ein Load-Befehl die Flags beeinflusst. Wenn nicht, 
gibt es oft den test-Befehl, der das erledigt. Oder ein bit-test.

Schau Dir Beispiele an, die so gut wie immer mit dem Compiler 
mitgeliefert werden, daraus lernte ich am meisten.


lda heißt Load Accu  (wenn Dein µP so etwas hat)
bpl heißt branch on plus  mit einem Ziel (+1 soll nur den NEG 
überspringen). Normalerweise gibt man hier ein Label an.

Bei den Branch-Befehlen steht dann immer dabei, wie die Flags stehen 
müssen, damit gesprungen oder nicht gesprungen wird.


Manche Prozessoren haben auch einen abs-Befehl. Das ist das einfachste.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>bin ich unverständlich oder sind die fragen nur zu einfach?
>need help

Die PSoc-Assemblerprogrammierung ist halt nicht sehr verbreitet (auch 
bei mir nicht). Der Befehlssatz ist mit 38 Befehlen allerdings recht 
übersichtlich.

- Um ein (oder mehrere Bits zu testen) gibt es den Befehl TST
- ein Zweierkomplement eines Bytes kann mit
          $FF-Byte
  oder mit mit PSoc-Befehlen mit
          cpl A
          SUB A, 1
  realisiert werden.

Ohne Gewähr würde das Ganze etwa so aussehen:

      mov A,Byte  ; deinen Wert nach A
      tst A,$80   ; Bittest
      jz aaa      ; Sprung wenn Bit=0
      com A       ; Komplementbildung
      sub A,1
aaa:  ...         ; weiter

MfG Spess

Autor: Alex V. L. (bastel_alex) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen herzlichen dank!

Autor: Alex V. L. (bastel_alex) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kurze nachfrage: das sub A,1 müsste doch vor der komplementbildung 
geschehen oder?

bei der bildung eine neg. zahl mache ich ja auch erst komplement, dann 
+1 -> umkehr dann -1, dann komplement oder etwa nicht?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der Fehler ist, das es 'sub A,-1' heißen sollte. Ich hatte das mal zur 
2er-Komplementbildung von Mehrbytezahlen auf AVRs verwendet. Und die 
können keine Addition von Konstanten, nur Subtraktion. Bei deinem 
Controller kannst du auch 'add A,1' verwenden.

MfG Spess

Autor: Alex V. L. (bastel_alex) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die ausgezeichnete hilfe, hab es jetzt!

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.