PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlerhaftes AVR Instruction Set?



Mitch64
05.06.2017, 21:14
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

Searcher
06.06.2017, 05:41
Hallo,


...ergibt das den Opcode: A808

beim Compilieren von STS 8,r16 (1010 1kkk dddd kkkk) ebenfalls.

http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_STS_-_Store_Direct_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

Mitch64
06.06.2017, 06:53
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 (https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjmjZ_zs6jUAhWJZFAKHVquBoMQFgguMAA&url=http%3A%2F%2Fwww.atmel.com%2Fimages%2FAtmel-0856-AVR-Instruction-Set-Manual.pdf&usg=AFQjCNEI01OrUfLSe7Rn-qtcwJ3igaAf5A)

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

Searcher
06.06.2017, 07:46
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

oberallgeier
06.06.2017, 14:47
Hi Mitch!

.. Stellt sich die Frage was nun stimmt. Hier die Atmel AVR Instruction Set als PDF (https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjmjZ_zs6jUAhWJZFAKHVquBoMQFgguMAA&url=http%3A%2F%2Fwww.atmel.com%2Fimages%2FAtmel-0856-AVR-Instruction-Set-Manual.pdf&usg=AFQjCNEI01OrUfLSe7Rn-qtcwJ3igaAf5A) ..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 (https://www.roboternetz.de/community/threads/68120-Fuse-Bits?p=620177&viewfull=1#post620177)). 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

.. 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 (http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf).

Hier ist unten: Der Umgang mit Mikrocontrollern ohne das Datenblatt zu lesen gehört zu einem der letzten großen Abenteuer unserer Tage.

Mitch64
06.06.2017, 17:33
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

Searcher
07.06.2017, 06:32
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:


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

oberallgeier
07.06.2017, 08:28
.. ergibt das den Opcode: A808 .. Compilieren von STS 8,r16 (1010 1kkk dddd kkkk) ebenfalls ..
.. 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 ..
.. Nicht alle Mikrocontroller von AVR haben denselben Satz Instruktionen eingebaut/freigegeben - dafür gibts nämlich das Datenblatt ..


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

Searcher
07.06.2017, 14:08
Hallo nochmal,


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

Mitch64
07.06.2017, 19:01
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