Branches und absolute Sprünge durch kürzere erssetzen

Gast #2659026
Lesenswert?

Hallo,

ich programmiere unter anderem für einen MEGA162, der 16384 Bytes Flash 
hat. Mein Programm ist aber inzwischen 17092 Bytes groß, es passt also 
nicht mehr ins FLASH. Es gibt auch keine pinkompatible DIP-Version mit 
mehr als 16kB FLASH. Also muss ich Speicherplatz sparen, z.B. indem ich 
jmp/call zu rjmp/rcall mache und
breq label0
rjmp label1
label0:
...
label1:

zu
brne l1
mache. Gibt es eine Möglichkeit herauszufinden welche jmp/call- bzw. 
breq l0 & rjmp l1-Befehle so kurz sind, dass man sie durch die kürzeren 
relativen ersetzen kann?
Gast #2659044
Lesenswert?

>PC-Programm schreiben, welches das Assembler-Listing analysiert. Musst
>nur die Sprungbefehle im Listing finden und aus dem dargestellten Opcode
>und der Befehlsadresse die Distanz berechnen.
>Sonst nen kleines Script schreiben und das .asm file parsen?!

Genau dies hatte ich mir gedacht. Es wäre halt schön, wenn jemand sowas 
bereits gemacht hat. Danke für die schnellen Antworten.
#2659106
Lesenswert?

du könntest alle call durch rcall und alle jmp durch rjmp ersetzen 
lassen, mach jeder Editor. Beim erneuten übersetzen des Programms 
meckert der Assembler dann schon die Sprünge an die zu weit entfernt 
sind. Allerdings spielt auch die Anordnung/Reihenfolge von 
Unterprogrammen eine Rolle - wenn häufig vom Speicheranfang zum Ende und 
wieder zurück gesprungen werden muss sinkt das Optimierungspotential.
Aber wie schon erwähnt - erst mal mit zählen der Befehe checken ob sichs 
überhaupt lohnen könnte.

Sascha

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren