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 André H. - 10.08.2004 12:59)
Als Antwort auf Hilfe bei Parameterübergabe von C2 nach Assembler von B.Willi - 10.08.2004 11:34
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT_V2, 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.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: Hilfe bei Parameterübergabe von C2 nach Assembler (von B.Willi - 12.08.2004 9:46)