Wer kann Assembler? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 366177
Ltof Inventar
Beiträge: 9329 Wohnort: Hommingberg
|
|
Im Datenblatt steht im Register Summary vor ADMUX "$07 ($27)". Wofür stehen die zwei verschiedenen Adressen?
Ansonsten:
Einfach mal ein Miniproramm mit BASCOM schreiben und nachschauen, was der Compiler daraus macht. Vielleicht erkennt man etwas wieder.
edit: DonComi war schneller!
Gruß,
Ltof
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
[ Diese Nachricht wurde geändert von: Ltof am 3 Sep 2006 19:25 ] |
|
BID = 366180
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Hallo Ltof,
hmm, mit mir ist mal garnichts los. Man merkt das vermutlich auch aus meinen Postings .
@Fragensteller:
Ganz ehrlich, das Programm ist recht lang und der Kram gegen ende doch sehr merkwürdig (ich denke mal, einfacher Datenmüll oder evtl. Tabellen, mit denen man nichts anfagen kann).
Der Disassembler versucht dann, aus diesem Schrott wieder die Befehle samt Parametern zu dekodieren, was dann meistens schiefgeht. Denn der Disassembler kann Programmcode und "Benutzerdaten" nicht auseinanderhalten.
PS: Ich würds neuschreiben .
_________________
|
|
BID = 366716
robodriver Stammposter
Beiträge: 217
|
Hi leute!
also ich habe mich jetzt mal intensievst mit dem Ding beschäftigt und die entsprechende Stelle gefunden und bin nun dabei alles auseinander zu nehmen. Dabei habe ich mal ein paar Fragen.
Zunächst einmal der Code wie er jetzt aussieht:
Code : |
+000003A4: B987 OUT 0x07,R24 Out to I/O location ADMUX auf ADC1 setzen
+000003A5: D7AB RCALL +0x07AB Relative call subroutine gosub +00000B51
+000003A6: E6A0 LDI R26,0x60 Load immediate var26=96
+000003A7: E0B0 LDI R27,0x00 Load immediate var27=0
+000003A8: 939C ST X,R25 Store indirect x=var25
+000003A9: E6A0 LDI R26,0x60 Load immediate var26=96
+000003AA: E0B0 LDI R27,0x00 Load immediate var27=0
+000003AB: 910D LD R16,X+ Load indirect and postincrement var16=x, x=x+1
+000003AC: 911C LD R17,X Load indirect var17=x
+000003AD: 3802 CPI R16,0x82 Compare with immediate if var16<130 then c=1,else c=0
+000003AE: E050 LDI R21,0x00 Load immediate var21=0
+000003AF: 0715 CPC R17,R21 Compare with carry if var17<var21 then c=1, else c=0
+000003B0: C01D RJMP +0x001D Relative jump goto +000003CE
+000003CE: 919C LD R25,X Load indirect var25=x
+000003CF: E7A9 LDI R26,0x79 Load immediate var26=121
+000003D0: 938D ST X+,R24 Store indirect and postincrement ???
+000003D1: 939C ST X,R25 Store indirect x=var25
+000003D2: E6A0 LDI R26,0x60 Load immediate var26=96
+000003D3: E0B0 LDI R27,0x00 Load immediate var27=0
+000003D4: 910D LD R16,X+ Load indirect and postincrement var16=x, x=x+1
+000003D5: 911C LD R17,X Load indirect var17=x
+000003D6: 3000 CPI R16,0x00 Compare with immediate if var16<0 then c=1,else c=0
+000003D7: E050 LDI R21,0x00 Load immediate var21=0
+000003D8: E081 LDI R24,0x01 Load immediate var24=1
|
|
und so weiter und so fort... Das sind erstmal die wichtigsten entscheidenden Zeilen.
Nun meine Frage:
Ich versteh das hier nicht:
Code : |
+000003A5: D7AB RCALL +0x07AB Relative call subroutine (gosub +00000B51) |
|
dies bedeutet ja, das auf die Zeile B51 gesprungen wird (3A5+7AB+1)
und nun der Code ab B51:
Code : |
+00000B51: 003A ??? Data or unknown opcode
+00000B52: 2020 AND R2,R0 Logical AND
+00000B53: 2020 AND R2,R0 Logical AND
+00000B54: 0000 NOP No operation
+00000B55: 0020 ??? Data or unknown opcode
+00000B56: 2043 AND R4,R3 Logical AND
+00000B57: 2020 AND R2,R0 Logical AND
+00000B58: 0000 NOP No operation
+00000B59: 4120 SBCI R18,0x10 Subtract immediate with carry
+00000B5A: 7A6E ANDI R22,0xAE Logical AND with immediate
+00000B5B: 6861 ORI R22,0x81 Logical OR with immediate
+00000B5C: 206C AND R6,R12 Logical AND
+00000B5D: 7453 ANDI R21,0x43 Logical AND with immediate
+00000B5E: 7261 ANDI R22,0x21 Logical AND with immediate
+00000B5F: 7374 ANDI R23,0x34 Logical AND with immediate
+00000B60: 2020 AND R2,R0 Logical AND
+00000B61: 2020 AND R2,R0 Logical AND
+00000B62: 2020 AND R2,R0 Logical AND
+00000B63: 0020 ??? Data or unknown opcode
+00000B64: 2020 AND R2,R0 Logical AND
+00000B65: 2020 AND R2,R0 Logical AND
+00000B66: 2020 AND R2,R0 Logical AND
+00000B67: 2020 AND R2,R0 Logical AND
+00000B68: 4520 SBCI R18,0x50 Subtract immediate with carry
+00000B69: 6E69 ORI R22,0xE9 Logical OR with immediate
+00000B6A: 0000 NOP No operation
+00000B6B: 6265 ORI R22,0x25 Logical OR with immediate
+00000B6C: 7561 ANDI R22,0x51 Logical AND with immediate
+00000B6D: 2074 AND R7,R4 Logical AND
+00000B6E: 6573 ORI R23,0x53 Logical OR with immediate
+00000B6F: 7469 ANDI R22,0x49 Logical AND with immediate
+00000B70: 2020 AND R2,R0 Logical AND
+00000B71: 3020 CPI R18,0x00 Compare with immediate
+00000B72: 2E31 MOV R3,R17 Copy register
+00000B73: 3130 CPI R19,0x10 Compare with immediate
+00000B74: 322E CPI R18,0x2E Compare with immediate
+00000B75: 3030 CPI R19,0x00 Compare with immediate
+00000B76: 2036 AND R3,R6 Logical AND
+00000B77: 2020 AND R2,R0 Logical AND
+00000B78: 2020 AND R2,R0 Logical AND
+00000B79: 2020 AND R2,R0 Logical AND
+00000B7A: 2020 AND R2,R0 Logical AND
+00000B7B: 2020 AND R2,R0 Logical AND
+00000B7C: 2020 AND R2,R0 Logical AND
+00000B7D: 2020 AND R2,R0 Logical AND
+00000B7E: 2020 AND R2,R0 Logical AND
+00000B7F: 2020 AND R2,R0 Logical AND |
|
Hier vermisse ich irgendwie einen RET Befehl, das er wieder zur Zeile +000003A6 zurück springt. Aber sowas seh ich hier nicht, ab wann springt er also wieder zurück???
und meine zweite Frage: Was genau passiert in dieser Zeile:
Code : |
+000003D0: 938D ST X+,R24 Store indirect and postincrement |
|
und meine dritte und letzte Frage:
Was zum teufel soll das bringen:
Code : |
+000003A6: E6A0 LDI R26,0x60 Load immediate
+000003A7: E0B0 LDI R27,0x00 Load immediate
+000003A8: 939C ST X,R25 Store indirect
+000003A9: E6A0 LDI R26,0x60 Load immediate
+000003AA: E0B0 LDI R27,0x00 Load immediate
|
|
kann man sich nicht das zweite beschreiben der Register sparen? Kann ich das ganze Ignorieren, ist das so ein Sinnloser fehler der beim Compilieren passiert ist oder hat das was mit dem ST X,R25 zu tun?
Währe toll wenn mir das jemand erklären könnte.
Ansonsten ist das schon ziemlich interessant
Vielen Dank schonmal
|
BID = 366740
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Wenn du keine Fehler gemacht hast, dann ist der Code schortt, denn ist ja wohl klar was
"Data or unknown opcode"
meint.
Die nächsten drei Befehle machen auch keinen Sinn, wird sich um einen Versuch des Disassemblers handeln, irgendwelche Daten als Befehl zu dekodieren.
>>+000003D0: 938D ST X+,R24 Store indirect and postincrement
Na, der Wert, der in R25 steht wird ins SRAM geschrieben, und zwar an die durch XL und XH adressierte Stelle. Danach wird das Adress-Doppelregister X inkrementiert (erhöht um 1).
Zum letzten:
Auch klar, dass der Compiler nicht immer den absolut am besten Code machen kann!
Hier wird erstmal die Adresse einer Variablen/einer Speicherzelle im RAM ins Doppelregister R26:R27 geladen, dann wird der Wert aus R25 ins RAM gepackt.
_________________
|
BID = 366776
robodriver Stammposter
Beiträge: 217
|
also das mit dem Code:
Code : |
+00000B51: 003A ??? Data or unknown opcode
+00000B52: 2020 AND R2,R0 Logical AND
+00000B53: 2020 AND R2,R0 Logical AND
+00000B54: 0000 NOP No operation
+00000B55: 0020 ??? Data or unknown opcode
+00000B56: 2043 AND R4,R3 Logical AND
+00000B57: 2020 AND R2,R0 Logical AND
+00000B58: 0000 NOP No operation
+00000B59: 4120 SBCI R18,0x10 Subtract immediate with carry
+00000B5A: 7A6E ANDI R22,0xAE Logical AND with immediate
+00000B5B: 6861 ORI R22,0x81 Logical OR with immediate
+00000B5C: 206C AND R6,R12 Logical AND
+00000B5D: 7453 ANDI R21,0x43 Logical AND with immediate
+00000B5E: 7261 ANDI R22,0x21 Logical AND with immediate
+00000B5F: 7374 ANDI R23,0x34 Logical AND with immediate
+00000B60: 2020 AND R2,R0 Logical AND
+00000B61: 2020 AND R2,R0 Logical AND
+00000B62: 2020 AND R2,R0 Logical AND
+00000B63: 0020 ??? Data or unknown opcode
+00000B64: 2020 AND R2,R0 Logical AND
+00000B65: 2020 AND R2,R0 Logical AND
+00000B66: 2020 AND R2,R0 Logical AND
+00000B67: 2020 AND R2,R0 Logical AND
+00000B68: 4520 SBCI R18,0x50 Subtract immediate with carry
+00000B69: 6E69 ORI R22,0xE9 Logical OR with immediate
+00000B6A: 0000 NOP No operation
+00000B6B: 6265 ORI R22,0x25 Logical OR with immediate
+00000B6C: 7561 ANDI R22,0x51 Logical AND with immediate
+00000B6D: 2074 AND R7,R4 Logical AND
+00000B6E: 6573 ORI R23,0x53 Logical OR with immediate
+00000B6F: 7469 ANDI R22,0x49 Logical AND with immediate
+00000B70: 2020 AND R2,R0 Logical AND
+00000B71: 3020 CPI R18,0x00 Compare with immediate
+00000B72: 2E31 MOV R3,R17 Copy register
+00000B73: 3130 CPI R19,0x10 Compare with immediate
+00000B74: 322E CPI R18,0x2E Compare with immediate
+00000B75: 3030 CPI R19,0x00 Compare with immediate
+00000B76: 2036 AND R3,R6 Logical AND
+00000B77: 2020 AND R2,R0 Logical AND
+00000B78: 2020 AND R2,R0 Logical AND
+00000B79: 2020 AND R2,R0 Logical AND
+00000B7A: 2020 AND R2,R0 Logical AND
+00000B7B: 2020 AND R2,R0 Logical AND
+00000B7C: 2020 AND R2,R0 Logical AND
+00000B7D: 2020 AND R2,R0 Logical AND
+00000B7E: 2020 AND R2,R0 Logical AND
+00000B7F: 2020 AND R2,R0 Logical AND |
|
kam mir auch schon etwas komisch vor. aber angesichts dessen, dass das die aller letzten Zeilen im Programm sind, vermute ich mal, dass das nicht schlimm weiter ist, während des Programmes steht da eigentlich kein
"Data or unknown opcode"
und die ganzen AND Verknüpfungen werden somit, denk ich mal, nicht durchgegangen.
|
BID = 366847
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Muss nicht, nein.
Ich vermute, dass dort
- entweder Daten liegen, die z.b. als Wertetabelle dienten
- oder zufälliger Datenmüll, der nichts mit dem eigentlichen Programm zu tun hat und dann auch nicht ausgeführt wird (, wenn nicht, wie oben, dort hingehoppst wird, deswegen fand ich es auch etwas merkwürdig, dass ein rcall auf diesen Humbug gesetzt wurde.)
Ich sag mal so:
Ich würde mir hier keine weiteren Mühen machen, sondern das ganze neu programmieren. Das kann ja in Hochsprache nicht allzuschwer sein. Wenn man hochsprachenkompilierte Assembercodes hat, dann sind die nicht bis zu 100% optimiert, so, wie wenn ich direkt in Assemblersprache schreibe. Damit muss man halt leben und es geht ja auch wunderbar.
Dazu kommt halt, dass man sich nicht immer sicher sein kann, ob der Befehl, der da vor eiem steht jetzt so sein soll, oder ob man schon im Flashnirvana irgenwelchen Datenblödsinn vom Disassembler dekodiert bekommt. Logisch kann daraus nichts werden .
_________________
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 24 Beiträge im Durchschnitt pro Tag heute wurden bisher 2 Beiträge verfasst © x sparkkelsputz Besucher : 182289710 Heute : 533 Gestern : 4667 Online : 489 6.11.2024 6:28 0 Besucher in den letzten 60 Sekunden ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0551488399506
|