PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (ASM) Subroutine und Parameterübergabe auf dem Stack


Tiamat
2009-06-08, 21:31:13
Hi Leute,
also wir programmieren dieses Semester in einem Fach Motorola 68000 in Assembler.
Also der Sprachumfang ist eigentlich ziemlich schlank, allerdings gibt es ein Konzept, was ich net so wirklich verstehe.

Ich möchte vor einem Unterprogrammaufruf gewisse Parameter auf dem Stack ablegen. Beim 68k gibt es keinen speziellen PUSH Befehl ( is einfach MOVE ) und als Stackpointer benutzt man einfach das Adressregister A7.

Um etwas auf den Stack zu legen macht man also
MOVE var,-(A7), um etwas vom Stack herunterzunehmen
MOVE (A7)+,var

Jetzt hab ich ne ganze Liste an Zahlen, man könnte sagen ein Array und diese einzelnen Zahlen der Liste leg ich auf den Stack ab.
Dann möchte ich ein Unterprogramm aufrufen , welches sich um die Bearbeitung der Parameter kümmert.
JSR unterprogramm

Das Problem was ich jetzt habe ist, dass die Rücksprungadresse automatisch auf dem Stack abgelegt wird, und mir so den Zugang zu den Parametern erschwert ( mir fällt schon was ein wie ich trotzdem herankomme ), aber was noch drastischer ist, mich daran hindert den Stack nach getaner Arbeit wieder abzubauen.

Eine Möglichkeit wäre, die Rücksprungadresse in einem anderen Register zu sichern, die Rücksprungadresse auf dem Stack einfach herunterzunehmen und den Stack Element für Element abzubauen. Irgendwie erscheint mir das jedoch sinnlos, wozu wurde die Adresse dann auf dem Stack hinterlegt, wenn ich so rumfrickeln muss.

Wie löst man das Problem denn üblicherweise ?

Gast
2009-06-08, 21:40:27
Mit pre-decrement und post-increment bist du ja schon gut dabei. In der Befehlsreferenz gibts dann noch so schöne Adressierungsarten wie displacement mode oder index mode -> http://e-www.motorola.com/files/archives/doc/ref_manual/M68000PRM.pdf ab 2.2

Wenn du irgendwo ein array liegen hast, würde sich aber eigentlich anbieten, nur den Zeiger auf den Anfang zu übergeben. Bringt performance.

Tiamat
2009-06-08, 22:22:02
Hi,
ja da wird auch n Pointer auf die Anfangsadresse des Arrays benutzt. Ich kann den Code ja mal posten.
Was uns auf jeden Fall gesagt wurde.. Sind die Parameter erst mal auf dem Prozessorstack, kann das Programm mit vollem CPU-Speed ( quasi im Cache ) bearbeitet werden. Zugriff auf Speicheradressen ist natürlich langsamer als CPU-Register.

Ok hier mal der Code :

ORG $2000

subr: Wie gesagt Zugriff is weniger das Problem , aber abbauen is einer
RTS return ; Return subroutine
START:
LEA asize, A0 ; Arraygröße in A0
LEA array,A1 ; Anfangsadresse Array in A1
LEA asum,A2 ; Endergebnis in A2
CLR.B asum ; muss erst gecleared werden

params: (A1)+,-(A7) ; Parameter auf den Stack und Pointer erhöhen
ADD.B #1,D0 ; D0 dient als Schleifenzähler
CMP.B (A0),D7; CCR-Register abfragen
BNE params
MOVE.B #2,D0 ; Einsatz in Subroutine
JSR subr ; JUMP subroutine
return:

MOVE.B #9,D0 ;
TRAP #15

*Strings and vars
asize: DC.B 10
array: DC.B 12,20,-10,5,10,18,44,13,-11,-1
asum: DS.B 1

END START


Also die Index-Adressierung kenne ich eigentlich. Ich meine indirekte Displacement Adressierung müsste das hier sein
MOVE.B #8(A0,A2),D5

Aja ich wühl mich mal durch die Motorola Reference :D