- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Zweierkomplement bei Zahlen > 8Bit

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo PicNick,

    Ich glaube ich verstehe Dich...

    SignCheck bekommt in einem Pointerregister die Adresse von MSB in meinem Fall SRAM 0x01 für r2.

    Weiter schaut sie,ob Bit 7 gesetzt ist, wenn ja macht sie ein komplement(hier muß sie aber wissen, wie Breit meine Zahl ist) und signalisiert z.B. mit dem T Flag, daß ein Vorzeichenwechsel stattgefunden hat und kehrt mit ret zurück.
    Dann muß ich mir noch merken, ob T gesetzt ist und die SignCheck zum zweitem mal aufrufen diesmal mit der Adresse von r5 im Zeigerregister.
    Nach dem Multiplizieren könnte ich dann nach Bedarf die Adresse vom Produkt an die Funktion übergeben um das Produkt umzudrehen.
    Allerdings springe ich dann nicht in SignCheck, sondern ein paar Zeilen tiefer( nach dem Bit 7 test) rein.
    Die Anzahl der Bytes könnte man mit einem Universalregister übergeben...

    Hmmm, so in etwa ?

    Am sonsten freue ich mich natürlich über jedes konkrete Konzept.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ja, genau so in der Art.
    Überlegungen dazu:
    Speicherst du Little-Endian, kannst du leicht die gleichen Funktionen für verschiedene Bit-Anzahlen verwenden,
    Bei Big-Endian wiederum ist immer das Vorzeichen an der gleichen (relativen) Stelle
    Soll das ganze richtig brummen, wär noch zu überlegen, die Variablen überhaupt "aligned" abzulegen, dann ist das byte-offset immer direkt in den zwei low-Bits der adresse (32-Bit)
    Wiederum andererseits kannst du dir bei Floats ja auch das Format aussuchen, also die Mantissa vorn oder hinten, wie's besser passt

    Ein bißchen auf einem Zettel rumhirnen vor dem Codieren zahlt sich sicher aus.

    Noch eine böse Variante fällt mir ein: Die kannst die Bytes einer aktuellen Variablen einfach auf den Stack pushen, und die Funktion popt sie sich dort runter oder rechnet direkt im Stack, is ja auch nur Sram
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo PicNick,

    Danke für die Anregungen, es ist wirklich sehr interessant, sich die Möglichkeiten anzuschauen,
    Die Sache mit Parameterübergabe über Stack ist auch ganz nett, ich glaub auf dem PC wird es ja so gemacht.
    Bei einem gebe ich Dir vollkommen recht
    Ein bißchen auf einem Zettel rumhirnen vor dem Codieren zahlt sich sicher aus.
    Ich habe mir schon genug Gedanken zu der Funktion gemacht und immer geguckt, daß das Ergebnis, so von der Funktion zurückgeliefert wird, daß ich es direkt an die nächste Funktion reichen kann, ohne die Register umsortieren zu müssen.

    So wird nur am Anfang was von Ram geholt durch mehrere Funktionen durchgejagt, und zum Schluß das Ergebnis wieder im Ram geschreiben.

    Nicht gerade einfach zu lesen, spart aber Ram.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #14
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    @PicNick:
    Das Problem it dem $80 tritt beim low byte selber nicht auf, den fast immer auftretenden Überlauf kriet man ja mit, man muß halt danach das Carry flag mitnehmen und nicht erst mit ADD anfangen.

    NEG A
    sollte in der Wirkung vollkommen identisch mit den beiden Befehlen
    COM A
    SUBI A,0xFF
    sein, unabhängig in welchem Zusammenhang.
    Außer es kommt eine schlechte ISR-routine dazwischen, aber das will ja keiner.


    @Gock:
    Man spart durch das Subtrahieren schon etwas, man braucht die register mit 0 und 1 nicht, wenn man mit den oberen Registern abbeitet. MIt den unteren registern spart man tatsächlich nichts.

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo Besserwessi,

    Man spart durch das Subtrahieren schon etwas, man braucht die register mit 0 und 1 nicht, wenn man mit den oberen Registern abbeitet. MIt den unteren registern spart man tatsächlich nichts.
    Das Problem bei der Sache ist aber, daß Du bei subi register,-1 einen Überlauf bekommst(Carry), womit ein nachfolgender sbci ziemlich in die Hose geht.
    Außerdem sind die oberen Register zu wertvoll um damit Bitbang in Massen zu machen

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #16
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Ob man lieber die oberen Register benutzt oder 2 zusätzliche von den unteren, hängt davon ab was man sonst noch im Programm macht. Da haben beiden Lösungen ihre Berechtigung. Dabei hat auch da das abzeihen von -1 wieder einen kleinen Vorteil, denn man braucht nur ein konstantes Register mit 255, statt 0 und 1.

    Das mit dem Carry Flag ist kein Problem, sondern nötig, damit es funktioniert. Man muss nur für die Ganze Zahl -1 abziehen.
    Um mit +1 zu arbeiten sollte das carry flag gerade falsch sein.

    Die Methode mit subi / sbci wird übrigens auch von Atmel in der Aplication NOTE 200 benutzt. Die Abkürzung einmal com subi durch neg zu ersetzen allerdings noch nicht.

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad