PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablenproblem mit Printbin



albundy
19.07.2006, 18:47
Ich habe im Eeprom mehrere AT Befehle und Rufnummern für ein Modem programmiert.
Für die Ausgabe habe ich ein Array mit 25 Byte dimensioniert, in welches die entsprechenden Daten aus dem EEprom eingelesen werden.
Da die Ausgabe mit Printbin jedesmal unterschiedlich lang ist, habe ich für die Länge ebenfalls eine Variable dimensioniert.

L=5
Printbin Daten(1);L

Dabei werden aber immer alle 25 Byte vom Array ausgegeben !?!?!?
Wie kann ich ( ohne eine Schleife ) die Ausgabe, mit der Variablen auf die entsprechende Länge begrenzen ???

Ruppi
20.07.2006, 06:44
Hallo,
wenn ich mich recht errinnere, dürfen für die Anzahl der auszugebenden Elemente nur Konstanten eingesetzt werden. Wenn L immer 5 ist, würde ich die 5 besser in den PrintBin-Befehl schreiben.

Ruppi

PicNick
20.07.2006, 06:51
Wenn du die daten als strings speicherst, haben sie am ende eh' eine NULL, da würdest du keine Länge extra brauchen.

albundy
20.07.2006, 08:55
@Ruppi


The number of bytes to send can be specified by an additional numeric parameter.
das es nur Konstanten sein dürfen, lese ich da nicht heraus.

@Robert

daran habe ich auch schon gedacht, aber es sind ja auch Steuerbefehle dabei.
Ich werde mir mal in Assembler ansehen, was Bascom mit der Variablen beim Printbin macht.

PicNick
20.07.2006, 09:49
.. aber es sind ja auch Steuerbefehle dabei..
NULL kann's ja nicht sein, alles andere wäre ja wurst
Printbin byte = Print chr(byte)
d.h. das Zeichen geht 1:1 raus


Länge: Bascom ist eine Schweinebacke: Länge als variable geht nicht, das muß eine numerischer Wert sein

In dem Beispiel printet er zuerst B(14) ! und dann die variable "A" !!


Dim A As Byte
Dim B(14) As Byte
A = 4
Printbin B(1) ; A
'----------------------------------------------------------

A = 4
LDI r24,0x04
STS 0x0060,r24

Printbin B(1) ; A
LDI r19,0x0E ; len array (14)
LDI XL,0x61 ; B(1)
LDI XH,0x00
CALL L_0x00A4 ; printbin

LDI r19,0x01 ; len 1
LDI XL,0x60 ; A
LDI XH,0x00
CALL L_0x00A4 ; printbin


CLI
L_0x00A2:
RJMP L_0x00A2


L_0x00A4:
LD r24,X+
RCALL L_0x00AE
DEC r19
BRNE L_0x00A4
RET
L_0x00AE:
SBIS UCSRA,UDRE
RJMP L_0x00AE
OUT UDR,r24
RET

-tomas-
20.07.2006, 10:15
@PicNick
Mit welchen Disassembler hast Du den Code erzeugt? AVR-Studio 4 erzeugt aus meinem OBJ-Code keine Labels (die das Lesen deutlich vereinfachen).

BREQ PC+0x03 Branch if equal
JMP 0x000001C1 Jump
da hilft auch in AVR Studio kein Display/ShowLabels

albundy
20.07.2006, 11:08
@Robert


In dem Beispiel printet er zuerst B(14) ! und dann die variable "A" !!
genau das habe ich auch gerade herausgefunden.
Damit ist der Printbin Befehl für mich unbrauchbar. Wenn wenigstens ein Error beim kompilieren aufgetreten wäre ... ](*,)
Da die Ausgaberoutine so schön einfach ist, werde ich mir eine eigene in Assembler schreiben. Dann kann ich meinen EEprominhalt auch so lassen.

PicNick
20.07.2006, 11:17
..Mit welchen Disassembler..
Hehe, genau wegen diesen Labeln hab ich mir den Hex-Hacker selber zusammen gefriemelt. :mrgreen:

-tomas-
20.07.2006, 11:50
der :mrgreen: klingt nach
... ich hab da etwas für Dich ... :oops:

albundy
20.07.2006, 11:56
Hehe, genau wegen diesen Labeln hab ich mir den Hex-Hacker selber zusammen gefriemelt.

Das gibt (oder gab ?) es auch fertig.
So etwas war mal bei einem früheren AVRStudio mit bei.
Google mal nach "DisAVR" eventuell findet man den Disassembler noch.

PicNick
20.07.2006, 12:08
Weiß schon, nur macht er Streß, wenn man downloaden will. War mir aber wurst, so arg isses ja auch nicht, und wenn du was selber programmierst, weißt du erstens wenigstens, warum du abstürzt, und zweitens, man kann weiterbasteln und sich das Zeugs so herrichten, wie man es braucht.

-tomas-
20.07.2006, 12:35
disavr.exehttp://www.mikrocontroller.net/attachment.php/8471/disavr.exe verwendet zwar Labels, dafür ist das Ergebnis aber nackter ASM-Code (ohne Quelltext-Bezug).

man tauscht ein Problem gegen das andere...

PicNick
20.07.2006, 12:55
Sieh da, da klappt das runterladen. Danke.
Schau'n wir mal:
Output DisAVR.eXE


; Atmel AVR Disassembler v1.30
;
.cseg
.org 0

; 0000 940C
nop ; 0001 002A
reti ; 0002 9518
nop ; 0003 0000
reti ; 0004 9518
nop ; 0005 0000
reti ; 0006 9518
nop ; 0007 0000
reti ; 0008 9518
nop ; 0009 0000
reti ; 000A 9518
nop ; 000B 0000
reti ; 000C 9518
nop ; 000D 0000
reti ; 000E 9518
nop ; 000F 0000
reti ; 0010 9518
nop ; 0011 0000
reti ; 0012 9518
nop ; 0013 0000
reti ; 0014 9518
nop ; 0015 0000
reti ; 0016 9518
nop ; 0017 0000
reti ; 0018 9518
nop ; 0019 0000
reti ; 001A 9518
nop ; 001B 0000
reti ; 001C 9518
nop ; 001D 0000
reti ; 001E 9518
nop ; 001F 0000
reti ; 0020 9518
nop ; 0021 0000
reti ; 0022 9518
nop ; 0023 0000
reti ; 0024 9518
nop ; 0025 0000
reti ; 0026 9518
nop ; 0027 0000
reti ; 0028 9518
nop ; 0029 0000
ldi r24, 0x5F ; 002A E58F
out SPL, r24 ; 002B BF8D
ldi YL, 0x40 ; 002C E4C0
ldi ZL, 0x38 ; 002D E3E8
mov r4, ZL ; 002E 2E4E
ldi r24, 0x08 ; 002F E088
out SPH, r24 ; 0030 BF8E
ldi YH, 0x08 ; 0031 E0D8
ldi ZH, 0x08 ; 0032 E0F8
mov r5, ZH ; 0033 2E5F
ldi ZL, 0xFE ; 0034 EFEE
ldi ZH, 0x07 ; 0035 E0F7
ldi XL, 0x60 ; 0036 E6A0
ldi XH, 0x00 ; 0037 E0B0
clr r24 ; 0038 2788
avr0039: st X+, r24 ; 0039 938D
sbiw ZL, 0x01 ; 003A 9731
brne avr0039 ; 003B F7E9
ldi r24, 0x33 ; 003C E383
out UBRR, r24 ; 003D B989
ldi r24, 0x00 ; 003E E080
out ?0x20?, r24 ; 003F BD80
ldi r24, 0x18 ; 0040 E188
out UCR, r24 ; 0041 B98A
clr r6 ; 0042 2466
ldi r24, 0x04 ; 0043 E084
sts 0x0060, r24 ; 0044 9380 0060
ldi r19, 0x0E ; 0046 E03E
ldi XL, 0x61 ; 0047 E6A1
ldi XH, 0x00 ; 0048 E0B0
; 0049 940E
nop ; 004A 0052
ldi r19, 0x01 ; 004B E031
ldi XL, 0x60 ; 004C E6A0
ldi XH, 0x00 ; 004D E0B0
; 004E 940E
nop ; 004F 0052
cli ; 0050 94F8
avr0051: rjmp avr0051 ; 0051 CFFF
avr0052: ld r24, X+ ; 0052 918D
rcall avr0057 ; 0053 D003
dec r19 ; 0054 953A
brne avr0052 ; 0055 F7E1
ret ; 0056 9508
avr0057: sbis USR, 5 ; 0057 9B5D
rjmp avr0057 ; 0058 CFFE
out UDR, r24 ; 0059 B98C
ret ; 005A 9508
avr005B: sbiw ZL, 0x01 ; 005B 9731
brne avr005B ; 005C F7F1
ret ; 005D 9508
set ; 005E 9468
bld r6, 2 ; 005F F862
ret ; 0060 9508
clt ; 0061 94E8
bld r6, 2 ; 0062 F862
ret ; 0063 9508
.exit


Output avr_dis.eXE (Picnicks Hexhacker)


.NOLIST
.INCLUDE "M32DEF.INC"
.LIST
INIT:
JMP L_0x0054
INT0ADDR_:
RETI
.DB 0x00, 0x00 ;..
INT1ADDR_:
RETI
.DB 0x00, 0x00 ;..
INT2ADDR_:
RETI
.DB 0x00, 0x00 ;..
OC2ADDR_:
RETI
.DB 0x00, 0x00 ;..
OVF2ADDR_:
RETI
.DB 0x00, 0x00 ;..
ICP1ADDR_:
RETI
.DB 0x00, 0x00 ;..
OC1AADDR_:
RETI
.DB 0x00, 0x00 ;..
OC1BADDR_:
RETI
.DB 0x00, 0x00 ;..
OVF1ADDR_:
RETI
.DB 0x00, 0x00 ;..
OC0ADDR_:
RETI
.DB 0x00, 0x00 ;..
OVF0ADDR_:
RETI
.DB 0x00, 0x00 ;..
SPIADDR_:
RETI
.DB 0x00, 0x00 ;..
URXCADDR_:
RETI
.DB 0x00, 0x00 ;..
UDREADDR_:
RETI
.DB 0x00, 0x00 ;..
UTXCADDR_:
RETI
.DB 0x00, 0x00 ;..
ADCCADDR_:
RETI
.DB 0x00, 0x00 ;..
ERDYADDR_:
RETI
.DB 0x00, 0x00 ;..
ACIADDR_:
RETI
.DB 0x00, 0x00 ;..
TWSIADDR_:
RETI
.DB 0x00, 0x00 ;..
SPMRADDR_:
RETI
.DB 0x00, 0x00 ;..
L_0x0054:
LDI r24,0x5F
OUT SPL,r24
LDI YL,0x40
LDI ZL,0x38
MOV r4,ZL
LDI r24,0x08
OUT SPH,r24
LDI YH,0x08
LDI ZH,0x08
MOV r5,ZH
LDI ZL,0xFE
LDI ZH,0x07
LDI XL,0x60
LDI XH,0x00
CLR r24
L_0x0072:
ST X+,r24
SBIW ZL,0x0001
BRNE L_0x0072
LDI r24,0x33
OUT UBRRL,r24
LDI r24,0x00
OUT UBRRH,r24
LDI r24,0x18
OUT UCSRB,r24
CLR r6
LDI r24,0x04
STS 0x0060,r24
LDI r19,0x0E
LDI XL,0x61
LDI XH,0x00
CALL L_0x00A4
LDI r19,0x01
LDI XL,0x60
LDI XH,0x00
CALL L_0x00A4
CLI
L_0x00A2:
RJMP L_0x00A2
L_0x00A4:
LD r24,X+
RCALL L_0x00AE
DEC r19
BRNE L_0x00A4
RET
L_0x00AE:
SBIS UCSRA,UDRE
RJMP L_0x00AE
OUT UDR,r24
RET
L_0x00B6:
SBIW ZL,0x0001
BRNE L_0x00B6
RET
.DB 0x68, 0x94, 0x62, 0xF8, 0x08, 0x95, 0xE8, 0x94 ;h.b.....
.DB 0x62, 0xF8, 0x08, 0x95 ;b...


Ein Kommentar: Nach unbedingten Sprüngen und wenn keine Sprung oder Call daraufhinzeigt, bring ich den Code im Dumpformat.
Wenn nämlich Bascom oder sonstwer Text-Literale etc. abspeichert, will ich das auch lesen können.

Aber logo, die Hackerei fängt danach erst an, und Arbeit bleibt es immer.

An einem brauchbaren Source-Bezug bin ich noch am Arbeiten. Ist halt so, daß ich inzwischen etwas Übung habe und das eigentlich fast nicht mehr brauche.

PicNick
20.07.2006, 13:58
@Tomas Ich häng da eine Zip rein

albundy
20.07.2006, 15:54
@Robert

nicht schlecht, dein Disassembler. Womit hast du das Tool geschrieben ?

Eine Analyse der ISR - Routinen bezüglich der Push und Pop Arien, wäre toll.
Das man auf einen Blick sehen kann, welche Register gesichert werden müssen.
Ich mache es immer "zu Fuss", und das ist recht umständlich, wenn viele Verzweigungen vorhanden sind.

PicNick
20.07.2006, 16:02
Nun, danke, das ist mit MS VC++ Entenscheiss-Edition gemacht.

Du meinst jetzt eine Analyse durch Ablauftracing ? Das ist halt dann schon knapp am AVR-Simulator dran.
Man sollte mal zusammenfassen, welche Fragestellungen noch nicht durch Simulatoren etc. abgedeckt sind.

-tomas-
20.07.2006, 16:07
PicNick - tolle Arbeit !!

Habe auch mal die Disassambler-Outputs zwischen avr_dis.eXE und DisAVR.eXE verglichen. Das hornalte AVR-Tool kennt nicht mal den vollen Atmega-Befehlssatz und sagt immer NOP.

Hier ein Code-Schnipsel (Atmega169):

AVR-Studio:

+00000126: 3007 CPI R16,0x07
+00000127: F410 BRCC PC+0x03
+00000128: 940C0134 JMP 0x00000134
+0000012A: 91800124 LDS R24,0x0124


avr_dis.eXE (Picnicks Hexhacker)
CPI r16,0x07
BRCC L_0x0254
JMP L_0x0268
L_0x0254:
LDS r24,0x0124


und jetzt kommt Schrott: DisAVR.eXE
cpi r16, 0x07 ; 0126 3007
brsh avr012A ; 0127 F410
; 0128 940C
nop ; 0129 0134
avr012A: lds r24, 0x0124 ; 012A 9180 0124



An einem brauchbaren Source-Bezug bin ich noch am Arbeiten.Wäre nicht ein AfterBurner für den AVR-Studio-Ausgabefile einfacher zu programmieren? Immerhin steckt da alles schon drin - es fehlen nur die Labels!
Beispiel:

265: If Len(lcd_textbuffer) >= 7 Then
+00000125: 2F08 MOV R16,R24 Copy register
+00000126: 3007 CPI R16,0x07 Compare with immediate
265: If Len(lcd_textbuffer) >= 7 Then
+00000127: F410 BRCC PC+0x03 Branch if carry cleared
+00000128: 940C0134 JMP 0x00000134 Jump
266: Lcd_scrollmode = 1 'Scroll If Text Is Longer Than Display Size
+0000012A: 91800124 LDS R24,0x0124 Load direct from data space

PicNick
20.07.2006, 16:16
Ja, man muß schauen, wo man hin will, was man erreichen will.
Persönlich verwend' ich das Zeugs meistens als Bascom-Inline & Library Generator. d.h. wenn mir was nicht paßt, disassemblier' ich das Programm und verwende umgeschriebene Teile für inline oder library.

-tomas-
20.07.2006, 17:05
weil wir gerade so schön am disassemblieren sind...
hier ein weiterer AVR-Disassembler - obiger Code mit IDA:

ROM:0125 mov r16, r24
ROM:0126 cpi r16, 7
ROM:0127 brcc loc_12A
ROM:0128 jmp loc_134
ROM:012A ; ---------------------------------------------------------------------------
ROM:012A
ROM:012A loc_12A: ; CODE XREF: sub_112+15j
ROM:012A lds r24, unk_100124
Leider bekommt auch IDA den Bascom-OBJ-Code (Source-Bezug) nicht mit eingebunden.

albundy
20.07.2006, 17:35
@Robert


das ist mit MS VC++ Entenscheiss-Edition gemacht.
das kenne ich nicht. Aber heisst VC++ nicht Visual C++ ? Da hättest du doch auch eine visuelle Oberfläche erstellen können.
Das war nur so ein Gedanke.
Ich bin zwar in der DOS Zeit zum PC gekommen, habe mich aber bis heute nicht mit Kommandozeilen Programmen angefreundet.


Du meinst jetzt eine Analyse durch Ablauftracing ?
nicht direkt Tracing, sondern einfach nur alle Sprungziele in der ISR abklappern und die darin benutzten Register auflisten. Um diese dann in Bascom (NoSave) von Hand zu sichern.

@Tomas


Das hornalte AVR-Tool kennt nicht mal den vollen Atmega-Befehlssatz
wie soll es auch ??? Ich kann mich gar nicht mehr erinnern, wann das Tool beim AVRStudio dabei war. Jedenfalls zu einer Zeit, als nicht mal an ATMega's zu denken war und wurde seit dem nie neu rausgebracht.
Das hängt sicher auch mit nicht gewolltem ReverseEngeneering zusammen.


Leider bekommt auch IDA den Bascom-OBJ-Code (Source-Bezug) nicht mit eingebunden.
das wäre mir neu. Ich werde es morgen mal mit dem Code von einem ATMega32, den ich gerade am Wickel habe, probieren.
Welche Version hast du benutzt ?

-tomas-
20.07.2006, 18:42
@albundy

Welche Version hast du benutztEine etwas ältere IDA-Version: 4.15
Das Problem liegt darin, dass die Obj-Files von AVR halt "AVR Object Files" sind. Die sind nur mit sich selbst kompatibel...
(Bascom kann die glücklicherweise erzeugen.)

Viel spannender ist die Frage, wie man AVR-Studio überzeugt, an den Sprungstellen des HEX/Disassembler-Codes auch Labels zu setzen.
Irgendwie haben das die Programmierer einfach vergessen.


Das hängt sicher auch mit nicht gewolltem ReverseEngeneering zusammenDas ist es definitiv nicht, dann AVR Disassembliert auch heute jede *.HEX
Früher mit Labels, heute ohne Labels.

PicNick
20.07.2006, 18:55
ReverseEngineering verhindern ? Nun,
du kannst IMHO aus dem AVR-Studio-disassembler (einer HEx) eigentlich nur (sinnvoll) irgendwelche Hi-lights kontrollieren,
Aus dem wieder eine vollständige kompilierbare Source zu erzeugen, mann-o-mann , da schreib ich es gleich selber.