PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM / ASSEMBLER mit "Humpelpause"



NLB
30.10.2007, 15:59
Hi
Ich habe einen Assembler-Code, eingebettet in Bascom geschrieben, der nur funktioniert, wenn der Sprungbefehl (BRSH) eine "Humpelpause" einlegt!!!

Wenn zwischen BRSH und dem anzuspringenden Label viel Code steht (so um die 60 Zeilen) erscheint nach dem Compilieren die Fehlermeldung:
- Error: 220 / Forward jump out of Range

Wenn jedoch zwischen BRSH und dem anzuspringenden Label "Humpelpause:"
nur wenig Code steht (so um die 30 Zeilen) und hier eine zweite BRSH-Prüfung mit den selben Registerwerten erfolgt, mit denen die Humpelpause erreicht wurde, kann man gut und gerne weitere 30 Zeilen springen. - Und das Programm läuft wie gewünscht !!!

Die Anzahl der überspringbaren Zeilen ist etwas Code abhängig:
Wenn hier der Befehl
- LOADADR Irgendwas, X
steht, sind mehr Zeilen möglich als bei
- LOADADR Irgendwas(INDEX), X

Wenn zu oft "LOADADR Irgendwas(INDEX), X" steht, müssen die Humpelpausen weniger Code-Zeilen beinhalten, sonst gibt es wieder Error: 220



Ich habe mal den SoftwareStack erhöht, das bringt aber nichts.

Hat jemand eine Idee gegen Humpelpausen-Programmierung ???

Danke im Voraus

NLB

PicNick
30.10.2007, 16:18
Ja, Kollege, da hilft nur die "Instruction-Set" PDF, wo jeder Befehl klitzeklein beschrieben ist.
BRSH ist ein Befehl, der nur maximal +/- 63 Worte weit springen kann.
Die meisten (alle?) bedingten Sprungbefehle haben diese Eigenschaft. Dafür belegen diese Befehle aber auch nur 1 Wort (=16Bit = 2 Byte)

Man muß die Logik umdrehen:
Statt:


BRSH groesser_gleich
kleiner_als:
....
....


groesser_gleich:
.....


Schreibt man


BRLO kleiner_als ; umgedrehte bedingung
JMP groesser_gleich
kleiner_als:
....
....


groesser_gleich:
.....



Solche Schmankerl sind Gewohnheit, keine Sorge

NLB
30.10.2007, 17:02
Das funktioniert, Danke

Und wieder gilt:
--> Ach, was wäre ich ohne Robert vom RoboterNetz ???!!!


Hast Du auch noch einen Trick für:
lds r22, {Irgendwas(index)+2}

oder geht das nur über:
Loadadr Irgendwas(index) , Y
ld r20, Y+
ld r21, Y+
ld r22, Y+
ld r23, Y+

Der Loadadr braucht 13 Cyklen - und das macht lahm !!!


mfg NLB

PicNick
30.10.2007, 19:30
Ja, solche Befehle kosten, so direkt und einfach kann man da auch mit Assembler wenig machen:
tabelle1(Index1) = tabelle2(Index2)
sowas geht ins Blut und in die Cyklen.

Im Assembler zieht man solche Sachen von vornhinein etwas anders auf, auf jeden Fall individuell, je nach Problemstellung.
Da gibts keine allgemein gültigen Tricks.

Vergiss nicht:

"irgendwas(Index)+2" heisst ja

addresse "irgendwas" + ( index - 1 ) * tabellen-element-länge + 2

Wobei ja addressen mit 2 Byte=16 Bit gerechnet werden müssen.


btw: aufpassen mit Indizes:
Bascom rechnet immer von 1-nn und nicht 0-nn

roboterheld
30.10.2007, 19:52
warum proggst du nicht gleich in c?
bascom erzeugt keinen effektiven code, warum bemühst du dich dann um einpaar µs wenn das bascom deine arbeit wieder versaut.

.....Der Loadadr braucht 13 Cyklen - und das macht lahm !!! .....

lol....nach 2 bascomzeilen ist deine µs wieder im eimer..

NLB
31.10.2007, 09:20
Danke Picknick
Jetzt bin ich richtig stolz auf mich;
hatte heute Nacht ich einen Gedankenblitz und lese heute Morgen in Deinem Hinweis, daß ich das mit dem Adressen-Offset offenbar schon richtig interpretiert hatte. --> das wird jetzt ausprobiert !
Deine Beiträge sind wirklich von hoher Substanz !!!

Und somit beantwortet sich auch der glorreiche Hinweis vom RoboterHeld:
Er erinnert an die Geschichte vom Dübel und dem Bohrer.
Fragt einer im Baumarkt nach einem 10er Dübel und einem Bohrer hierzu.

Sagt die Verkäuferin (blond?):
Hier ist der Dübel, einen 10er Bohrer habe ich nicht; nehmen Sie doch einen 6er und einen 4er - das macht zusammen auch 10.

Sagt der Kunde (auch blond!):
Gut, aber dann nehme ich lieber zwei 5er, dann geht das Umspannen schneller.

roboterheld
31.10.2007, 13:46
du begreifst es nicht? das winavr-c meine ich.

...Ich habe mal den SoftwareStack erhöht, das bringt aber nichts. ....

die bascom-hilfe lesen, dann weisst du, das der s-stack damit nichts zu tun hat. datenblätter lesen und proggen lernen.