Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Hilfe bei Parameterübergabe von C2 nach Assembler Kategorie: Progr. Assembler, TaskingTools, OS (von B.Willi - 12.08.2004 9:46)
Als Antwort auf Re: Hilfe bei Parameterübergabe von C2 nach Assembler von André H. - 10.08.2004 12:59
Ich nutze:
CC2-Application-Board, OSOPT V3.0
> Hallo B.,
>
> > Und wieder habe ich ein Problem mit Assembler und C2.
> > Ich kriege die Parameterübergabe einfach nicht zum laufen.
> > Ich wäre sehr froh, wenn mir das mal jemand genau erläutern könnte,
> > zum Beispiel am Beispiel von Cris, das ich trotz Kommentare noch nicht ganz
> > durchschaut habe.
>
> Die Parameterübergabe ist sehr einfach.
> Die Systemtreiber sys0001 und sys0002 sollten Dir hier auch weiterhelfen.
> (siehe Segment3-MAP)
>
> Um Parameter zu übergeben, müssen diese zuerst auf den Thread-Stack
> gepusht und in den ASM-Routinen wieder gepoppt werden.
> Dabei können auch mehrere Parameter übergeben werden.
>
> Das Schieben von Werten auf den Stack geht am besten mit einer Inline-Funktion:
> inline function xy(int Wert1, byte Wert2, long Wert3, ...) returns int
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0x300; //Segment 3
>  inline vmcodes.VM_LOAD_IMMEDIATE_INT;
>  inline Einsprungadresse;
>  inline vmcodes.VM_SYSCALL;
> }

> So werden nacheinaner Wert1, Wert2 und Wert3 gepusht.
> Byte-Variablen werden als Integer behandelt.
> Long-Variablen belegen im Prinzip zwei Stackeinträge.
>
> In Assembler werden diese Werte durch den Aufruf entsprechender Systemroutinen
> wieder vom Stack geholt. Hier gilt LiFo (oder FiLo, wie mans sieht). Es wird zuerst
> zuletzt gepushte Wert vom Stack geholt.
> Dabei gibt es verschiedene Routinen für Integer und Long:
>
> ; Definition der OS-Routinen
> OSsegment     EQU     0
> POP_R4                EQU     0765AH  ;uses: R4, R12, R13, R14
> PUSH_R12      EQU     075D6H  ;uses: R1, R2, R12, R13,R14,R15
> POP_LONG      EQU     07680H  ;return in R4, R5
> PUSH_LONG     EQU     075fEH  ;Value in R12, R13
> ...
> ...
> xy    proc far
>       CALLS   OSsegment, POP_LONG     ;Wert3 vom Stack holen
>               ; Wert in R4(Lo-Word), R5(Hi-Word)
>       ...
>       CALLS   OSsegment, POP_R4       ;Wert2 vom Stack holen
>               ; Wert in R4
>       ...
>       CALLS   OSsegment, POP_R4       ;Wert1 vom Stack holen
>               ; Wert in R4
>       ...
>       ...
>       CALLS   OSsegment, PUSH_R12     ;Integerwert auf den Stack laden
>               ; Wert vorher in R12 schreiben
>       POP R1
>       POP R1
>       RETS
> xy    endp
>

> Bevor Du den nächsten Wert vom Stack holst, mu�t Du ihn in einem anderen, nicht
> von den POP-Funktion benutzen Register sichern.
> Den in ASM gepushten Wert erhält man als Rückgabewert der inline-Funktion.
> Die inline-Code in der Inline-Funktion sind der ASM-Aufruf.
> Alternativ könnte man diese auch der Funktion übergeben:
> inline function xy(int Wert1, byte Wert2, long Wert3, ..., int Segment, int Adresse) returns int
> {
>  inline vmcodes.VM_SYSCALL;
> }

> Hier ist es aber wichtig, daÃ? der Vorletzte Wert die Segment-Nr. und der letzte
> die Einsprungadresse sind.
>
> Einen Sonderfall der Parameterübergabe stellen Arrays, Strings und eigene Datentypen dar:
> (Strings und eigene Datentypen sind genaugenommen auch nur Arrays)
> inline function xy(int Array[], String s, ...)
> {
>  ...
> }

> Hier werden keine Werte, sondern die Adresse im RAM des ersten Array-Elements übergeben.
> Man kann in ASM so direkt in den Arrays Datenändern.
> Wie das geht sollte wiederum in sys0001.asm und sys0002.asm zusammen mit den Modulen,
> die diese Systemtreiber benutzen, ersichtlich werden.
>
> Ich hoffe, das macht die Paramterübergabe etwas klarer.
>
> MfG André H.
>

Hallo André
vielen Dank für deine ausführliche Antwort!
Dank deiner Einführung habe ich es jetzt begriffen und kann nun ohne Probleme
Variablen übergeben.
Nochmals vielen Dank für deinen Einsatz!
MfG Beni


    Antwort schreiben


Antworten: