PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : register sichern bei bascom-asm-aufrufe



sechsrad
11.02.2008, 10:47
hallo, müssen eigentlich register gesichert werden wenn ich eine selbsterstellte asm-routine in bascom aufrufe > $asm....$endasm ?
sichert bascom in diesem falle die register alleine, oder muss ich aufpassen, ob alles so abläuft und dann evtl sicherungen vornehmen?

wenn ich eine interrupt-routine aufrufe , sehe ich das register gesichert weren (siehe unten).



Messen:
push r10
push r11
push r24
push r25
push r26
push r27
in r24,sreg
push r24

print "edee"

pop r24
!Out Sreg , R24
pop r27
pop r26
pop r25
pop r24
pop r11
pop r10

Return

MeckPommER
11.02.2008, 11:11
Bascom sichert die registern nicht, das muss im asm-Block geschehen.

Lt. Roboter-Wissen werden von Bascom selber nicht alle Register benötigt. Falls man eines der Register R4, R5, R6, R8, R9, R28, R29 benötigt, sollte man dieses vorher sichern.
Ich habe mich bei meinen Assembler-Subs stets auf die Register 21 - 27 beschränkt und bisher (toi-toi-toi) noch keine Probleme gehabt ohne diese Register zu sichern.

Gruß MeckPommER

P.S.: wichtig ist natürlich, das man sich selber seine register nicht mit interrupt-routinen zerschiesst, die selbige register benutzen.

Space
11.02.2008, 11:27
Da muss ich meinem Vorgänger mal wiedersprechen.

Bascom sichert beim Aufruf eines ISR generell alle Register. Nur mit der Option "Nosave", werden keine Register gesichert.

Welche Register wirklich gesichert werden müssen, bzw. welche von Bascom im Hauptprogramm gar nicht verwendet werden und somit im ISR uneingeschränkt zur Verfügung stehen, findet man am besten mit einem Decompiler raus.

Im Decompilat nach r1 bis r31 und nach x,y,z suchen. Einige Tips, welche Register je nach verwendeter Bascom Funktion frei sein sollten, findest du in der Bascom Hilfe. Das sind in etwa die, welche MeckPommER aufgeführt hat.

Thomas

sechsrad
11.02.2008, 13:39
habe das untenstehende programm erstellt.
man kann ja in bascom basic und asm mischen, deren befehle identisch sind, wird ein ! vorangestellt.

verhält sich das untenstehende programm genauso als wenn ich den asm-code in $asm/$endasm packe?

wird unten eine sicherung vorgenommen?
woher weiss ich, das der befehl "print" mir nicht irgendwie dazwischen haut?



$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000
$baud = 19200

Dim Z As Byte
Dim Command As Byte

Command = 1

For Z = 1 To 7
lds r21,{command}
lsl r21
Sts {command} , r21
Print Command
Next

End

PicNick
11.02.2008, 14:30
Bascom verläßt sich drauf, dass
SPL / SPH (Stackpointer)
YL / YH (SoftwareStack) R28 / R29
R4 / R5 (Frame)
R6 (Statusbyte)
und, wenn es "DATA" gibt
R8, R9

nicht verändert werden.

Alle anderen Register kannst du frei verwursteln, allerdings mach Bascom das auch, d.h. nach einem Bascom-Statement kannst du dich auf nix verlassen.



Bei deinem konkreten Beispiel kann es dir egal sein, da du ja kein register über den "Print" drüberretten mußt.

Bei den einzelnen-Assemblerbefehlen und bei "$asm" "$end asm" macht Bascom ÜBERHAUPT NIX automatisches.

Da gibt's noch ein paar Tips
https://www.roboternetz.de/wissen/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User

MeckPommER
11.02.2008, 16:12
@space: bascom sichert alle Register beim ISR? ei gugge, habsch wieder was gelernt :) Das steht bestimmt überall im Netz, aber ich bin bisher noch nicht darüber gestolpert oder habe es aufgrund eines Kabelbrandes im Oberstübchen wieder vergessen ^^

PicNick
11.02.2008, 16:18
.. Kabelbrandes im Oberstübchen ..
Vorsicht, kein Wasser zum Löschen ! :mrgreen:

Nicht alle,
R12
r13
r14
r15
lässt er aus

sechsrad
12.02.2008, 18:41
also nur ein kleenes kabel durchgebrannt.