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
achja und was den negativen AD wert angeht - in dem versuchsaufbau den ich hier bearbeite scheint er zu können.
bin ich unverständlich oder sind die fragen nur zu einfach? need help
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
vielen herzlichen dank!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.