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