- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 10

Thema: Fehlerhaftes AVR Instruction Set?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Hallo

    Mal als Info zum nachvollziehen.
    Compiliert habe ich mit Bascom-AVR. Dazu habe ich quasi eine kleine LIB erstellt, in der die zu übersetzenden Befehle stehen.
    Habe das dann von Bascom compilieren lassen über Werkzeuge/Libmanager und dann compiliert.
    So erhalte ich eine LBX-Datei, in der die Opcodes stehen.

    Die Lib's die man erstellt sind Prozessor-Unabhängig, da sie für alle Prozessoren gelten.
    Also Bascom weiß beim compilieren einer Lib in eine Lbx nichts von einem verwendeten Prozessor.

    Da das Schreiben von Hand zu mühselig war, habe ich ein Programm erstellt, das mir die Lib-Datei generiert.
    Bascom hat übersetzt und mit meinem Decompiler habe ich versucht das zurück zu übersetzen (decompilieren).

    Ich bin da stur vorgegangen.
    Und habe alle Möglichkeiten durchgespielt, um schwachstellen im Decompiler zu finden.

    Dabei habe ich stur den 16-Bit STS k,Rr angewendet.

    Es ist natürlich möglich, dass sich opcodes überschneiden wie LDI r20,$FF und SER r20, Hier gibts auch den selben Opcode aber auch das selbe Ergebnis.
    Bei STS und LDD ist das nicht der Fall.

    Möglicherweise gibts bei Prozessoren, die den 16-Bit STS unterstützen den LDD Rd,Y+q nicht, oder der wird anders kodiert.
    Vielleicht ist das die Ursache.

    Bei dem STS (16-Bit) steht noch folgendes:
    --
    A 7-bit address must be supplied. The address given in the instruction is coded to a data space address
    as follows:
    ADDR[7:0] = (INST[8], INST[8], INST[10], INST[9], INST[3], INST[2], INST[1], INST[0])
    Memory access is limited to the address range 0x40...0xbf of the data segment.
    This instruction is not available in all devices. Refer to the device specific instruction set summary.
    Operation:
    (i)
    (k) ← Rr
    (i)
    Syntax: Operands: Program Counter:
    STS k,Rr 16 ≤ r ≤ 31, 0 ≤ k ≤ 127 PC ← PC + 1
    16-bit Opcode:
    1010 1kkk dddd kkkk

    Was bedeutet dieser Teil: ADDR[7:0] = (INST[8], INST[8], INST[10], INST[9], INST[3], INST[2], INST[1], INST[0])?

    Mitch

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo Mitch,
    ich werfe einfach noch eine Info in den thread:

    Ich habe mit dem AVR Studio 4.19 für den Tiny10 folgende beide Zeilen assembliert:
    Code:
    ---- test_tiny10.asm ------------------------------------------------------------------------------
    27:           sts 65,r17
    +0000000B:   A911        STS       0x41,R17       Store direct to data space
    28:           sts 64,r16
    +0000000C:   A900        STS       0x40,R16       Store direct to data space
    Unter Zeile 27 bzw 28 stehen die erzeugten Hex Codes (16 Bit) und die Rückübersetzung. sts 64,r16 wurde zu A900.

    AVR Studio akzeptierte für den Tiny10 keine Adresse kleiner als 64 oder kein Register kleiner als r16. Assemblierfehler: entweder Operand out of range oder invalid register.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo nochmal,
    Zitat Zitat von Mitch64 Beitrag anzeigen
    Was bedeutet dieser Teil: ADDR[7:0] = (INST[8], INST[8], INST[10], INST[9], INST[3], INST[2], INST[1], INST[0])?
    (das erste (inst[8] wird noch invertiert)
    Gefunden aber nicht überprüft:
    https://board.flatassembler.net/topic.php?p=190850

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Hallo und Danke an alle.

    Ich denke ich habs jetzt geschnallt.

    Ich habe beim Disassembler jetzt eine Abfrage rein gemacht, die überprüft, ob der STS (16-Bit) korrekt ist.
    Wenn die Adresse aus dem Opcode extrahiert wird, folgt eine Prüfung, ob die Adresse im Bereich 0x40 bis 0xBF liegt.
    Wenn ja, wird STS (16-Bit) angewendet, ansonsten sucht der Disassembler einen anderen Mnemonic der passt. In dem Fall LDD <register>,Y+q

    Bis jetzt funktioniert es.
    Vielleicht gibts ja noch ne Überraschung. Wer weis.

    Ach übrigens.
    In VB.Net wird der Disassembler geschrieben. Und die Adresse von dem STS (16-Bit) dekodiere ich so:

    ' STS (16-Bit) kodiert die Adresse in besonderer Form
    Function getAddress_STS16(ByVal opcode As UShort) As Byte
    Dim adr As Byte = (opcode And &HF) Or _
    ((opcode And &H600) >> 5) Or _
    ((opcode And &H100) >> 2)
    Return adr
    End Function

    Das aber nur am Rande erwähnt.

    Also danke nochmal an alle.

    Mitch

Ähnliche Themen

  1. Fehlerhaftes Programm
    Von Kampi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 17.12.2009, 07:12
  2. Fehlerhaftes WinAvr?!?!?!
    Von Chris90 im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 12.04.2007, 17:44
  3. Suche Sleep-Instruction C-Code für ICCtiny 6.11A Compiler
    Von Lalupa im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 02.06.2004, 17:26
  4. Sleep-Instruction mit C-Compiler ICCtiny 6.11A. Wie?
    Von Lalupa im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 31.05.2004, 15:04

Berechtigungen

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

Solar Speicher und Akkus Tests