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 | ||
| ||
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) |