-
        

Ergebnis 1 bis 10 von 10

Thema: Fehlerhaftes AVR Instruction Set?

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

    Fehlerhaftes AVR Instruction Set?

    Anzeige

    Hallo zusammen

    Ich bin eben auf ein Problem gestoßen und bin mir nicht ganz sicher, wo das Problem liegt.

    Versucht es bitte mal selbst, ob das bei euch auch so ist.

    Folgendes:

    Beim Compilieren von LDD r0,y+48 (10q0 qq0d dddd 1qqq) )ergibt das den Opcode: A808
    und
    beim Compilieren von STS 8,r16 (1010 1kkk dddd kkkk) ebenfalls. Die Zahlen sind dezimal angegeben.

    Ich habe die beiden Instruktionen von Hand übersetzt, um meinen Compiler (Bascom) und meines Disassembler (selbst programmiert) auszuschließen.
    Nach Instruction Set kommt exakt das selbe raus.

    d ist übrigens das Register und
    q das Displacement, also der Offset.

    Habe ein älteres und ein aktuelles Instruktion Set ebenfalls überprüft, die Opcodes bleoben die selben.

    Liegt hier ein Problem bei den Atmel-Controllern vor oder ein Schreibfehler im Dokument 'Instruction Set'?


    Mitch
    Geändert von Mitch64 (05.06.2017 um 21:21 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.437
    Blog-Einträge
    111
    Hallo,
    Zitat Zitat von Mitch64 Beitrag anzeigen
    ...ergibt das den Opcode: A808

    beim Compilieren von STS 8,r16 (1010 1kkk dddd kkkk) ebenfalls.
    http://www.atmel.com/webdoc/avrassem...t_to_SRAM.html

    Für welchen AVR wurde das compiliert?


    Nach Instruction Set kommt exakt das selbe raus.

    d ist übrigens das Register und
    q das Displacement, also der Offset.

    Habe ein älteres und ein aktuelles Instruktion Set ebenfalls überprüft, die Opcodes bleoben die selben.

    Liegt hier ein Problem bei den Atmel-Controllern vor oder ein Schreibfehler im Dokument 'Instruction Set'?
    Auf welche Instruction Sets beziehst Du Dich da genau?

    Gruß
    Searcher
    Geändert von Searcher (06.06.2017 um 06:26 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Hallo Searcher

    vielen Dank für den Hinweis. Den kannte ich so nicht.
    Stellt sich die Frage was nun stimmt.
    Hier die Atmel AVR Instruction Set als PDF

    Ich beziehe mich auf den 16-Bit Befehl STS auf Seite 180 in der PDF.

    Dort steht etwas anderes, nämlich 0<=k<=127

    Die zugelassenen Register r16 bis r31, die mit werte 0b0000 bis 0b1111 kodiert werden, überein.

    Auf deinem Weblink kann man beim STS nur Werte für k= 0x40 bis 0cBF kodieren.
    Es sind doch 7 Bit für k verfügbar. Macht das Sinn?

    Gruß Mitch

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.437
    Blog-Einträge
    111
    Zitat Zitat von Mitch64 Beitrag anzeigen
    Es sind doch 7 Bit für k verfügbar. Macht das Sinn?
    Hi, ich weiß auch gerade nicht weiter. Es wird mal von Adresse gesprochen und dann soll der Assembler beim 16 Bit STS laut Webseite einen Offset daraus berechnen. Der Offset scheinen dann die 0<=k<=127 zu sein, die in die 7 Bit passen. Mmmmhh? Die 0..127 kann man ja direkt in den Befehl schreiben. Allerdings habe ich noch nie was für den Attiny10 assembliert.

    Ich bekomme die Webseite und das Instruction Set auch nicht so recht unter einen Hut. Die beiden A808er sind dadurch immer auch noch ein Rätsel - bin im Augenblick knapp an Zeit.

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

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.615
    Hi Mitch!
    .. Stellt sich die Frage was nun stimmt. Hier die Atmel AVR Instruction Set als PDF ..
    Das ist eine Liste von allen bei den AVR´s (8-bittern?) benutzten Instruktionen. Aber Searcher meinte was anderes

    .. Für welchen AVR wurde das compiliert? .. Auf welche Instruction Sets beziehst Du Dich da genau? ..
    .. nämlich für welchen Mikrocontrollertyp genau Du das Programm schreibst - und für welchen genau das laufen soll. Nicht alle Mikrocontroller von AVR haben denselben Satz Instruktionen eingebaut/freigegeben - dafür gibts nämlich das Datenblatt (siehe unten oder hier). Und es könnte sein, dass Dir der Befehl - wie beschrieben garnicht zur Verfügung steht. Hast Du das schon kontrolliert ? Die AVRs sind nämlich
    Zitat Zitat von DATASHEET COMPLETE ATmega328/P
    .. The Atmel® picoPower® ATmega328/P is a low-power CMOS 8-bit microcontroller based on the AVR® enhanced RISC architecture. ..
    Das steht gleich auf der ersten Seite zumindest beim hier zitierten Datenblatt 42735B von 11/2016 des 328/P.

    Hier ist unten: Der Umgang mit Mikrocontrollern ohne das Datenblatt zu lesen gehört zu einem der letzten großen Abenteuer unserer Tage.
    Geändert von oberallgeier (06.06.2017 um 14:54 Uhr) Grund: Quellenangabe
    Ciao sagt der JoeamBerg

  6. #6
    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

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.437
    Blog-Einträge
    111
    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

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.615
    Zitat Zitat von Mitch64 Beitrag anzeigen
    .. ergibt das den Opcode: A808 .. Compilieren von STS 8,r16 (1010 1kkk dddd kkkk) ebenfalls ..
    Zitat Zitat von Mitch64 Beitrag anzeigen
    .. 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 ..
    Zitat Zitat von oberallgeier Beitrag anzeigen
    .. Nicht alle Mikrocontroller von AVR haben denselben Satz Instruktionen eingebaut/freigegeben - dafür gibts nämlich das Datenblatt ..
    Zitat Zitat von ATtiny10_Datasheet_Complete-11/2016
    ..
    6.3.
    SRAM Data Memory

    ..The IN and OUT instructions can access all 64 locations of I/O memory. Direct addressing using the LDS and STS instructions reaches the 128 locations between 0x0040 and 0x00BF ..
    Da grins ich mich eins - von wegen RISC: ==> No RTFM plenty of RISC (´s)
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.437
    Blog-Einträge
    111
    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

  10. #10
    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, 08:12
  2. Fehlerhaftes WinAvr?!?!?!
    Von Chris90 im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 12.04.2007, 18: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, 18: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, 16:04

Berechtigungen

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