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


von Assemblerneuling (Gast)


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

von eProfi (Gast)


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.

von Assemblerneuling (Gast)


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

von Assemblerneuling (Gast)


Lesenswert?

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

von Assemblerneuling (Gast)


Lesenswert?

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

von eProfi (Gast)


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.

von Spess53 (Gast)


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

von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

vielen herzlichen dank!

von Alex V. (bastel_alex) Benutzerseite


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?

von Spess53 (Gast)


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

von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

danke für die ausgezeichnete hilfe, hab es jetzt!

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.