Cdecl

Cdecl

Unter Aufrufkonvention (engl. calling convention) versteht man die Methode, mit der in Computerprogrammen einer Funktion Daten übergeben werden. In der Regel liegt es am Compiler, welche Konvention zum Einsatz kommt, so dass der Programmierer sich nicht damit beschäftigen muss. Bei der Entwicklung von Software in mehreren Sprachen ist es jedoch erforderlich, dass alle Module kompatible Aufrufkonventionen verwenden.

Inhaltsverzeichnis

cdecl

Die cdecl-Aufrufkonvention wird von vielen C- und C++-Compilern verwendet, die auf der x86-Architektur laufen. Hierbei werden die Parameter nacheinander von rechts nach links auf den Stack gelegt. Rückgabewerte werden von der aufgerufenen Funktion in der Regel im EAX-Register der CPU abgelegt. Eine Ausnahme bilden Gleitkommazahlen, die in ST0 abgelegt werden. Die Register EAX, ECX und EDX stehen für die Verwendung innerhalb der Funktion zur Verfügung.[1]

Beispiel in C-Code:

int function(int, int, int);        /* Prototyp der Funktion */
int a, b, c, x;                     /* Variablendeklaration */
 
x = function(a, b, c);	       /* Funktionsaufruf */

Der Funktionsaufruf in der letzten Zeile erzeugt den folgenden x86-Assembler-Code (in MASM-Syntax):

 ; Argumente in umgekehrter Reihenfolge auf den Stack legen
 push c
 push b
 push a
 
 ; Funktion aufrufen
 call function
 
 ; Stack-Pointer zurücksetzen
 add esp, 12
 
 ; Rückgabewert der Funktion sichern
 mov x, eax

Die aufrufende Funktion baut nach dem Aufruf den Stack selbst wieder ab, indem der Stack-Pointer (gespeichert im ESP-Register) so gesetzt wird, dass er wieder auf die Position im Speicher zeigt, auf die er vor den Push-Operationen zeigte. Im Beispiel oben werden drei Integer, also 12 Bytes, auf den Stack gelegt. Da der Stack in x86-Systemen von oben nach unten wächst, wird dabei ESP um 12 dekrementiert. Um wieder auf die Position von vorher zu kommen, muss im Anschluss an den Aufruf wieder 12 auf den Wert im ESP-Register addiert werden. So können auch Funktionen mit variabler Argumenten-Anzahl und Länge realisiert werden.

Die cdecl-Aufrufkonvention ist gewöhnlich die Standard-Aufrufkonvention eines x86-C-Compilers. Allerdings verfügen viele Compiler über die Option, eine andere Konvention zu verwenden.

Eine Funktion kann manuell mit folgender Syntax als cdecl-Funktion deklariert werden:

void _cdecl function(params);

Pascal

Bei der Pascal-Aufrufkonvention werden die Parameter, im Gegensatz zur cdecl-Konvention, in der Reihenfolge von links nach rechts auf dem Stack abgelegt, und die aufgerufene Funktion muss den Stack-Pointer vor dem Rücksprung zum aufrufenden Code selbst zurücksetzen.

Register (FastCall)

Die Register- oder FastCall-Aufrufkonvention ist compilerspezifisch. Im Allgemeinen besagt sie, dass die ersten zwei oder drei Funktions-Argumente mit einer Größe von 32 Bit oder weniger in den Registern EAX, EDX, und möglicherweise auch ECX übergeben werden anstatt über den Stack. Die übrigen Argumente werden von rechts nach links auf dem Stack abgelegt, ähnlich wie bei cdecl. Die Rückgabewerte werden in den Registern AL, AX, oder EAX zurückgegeben.

Diese Konvention wird unter anderem im Linux-Kernel benutzt, um Argumente an System-Calls zu übergeben. Die System-Call-Nummer, die jeden möglichen Aufruf eindeutig bestimmt, wird im EAX-Register abgelegt, während alle Argumente an die Kernel-Funktion in den Registern EBX, ECX, EDX, ESI und EDI gespeichert werden. Müssen mehr Argumente übergeben werden, wird einfach eine Datenstruktur mit den benötigten Elementen im Speicher abgelegt und ein Zeiger auf diese als Argument an die Funktion weitergereicht.

stdcall

Die stdcall-Aufrufkonvention ist de facto die Standard-Aufrufkonvention für die Microsoft Win32-API. Funktionsparameter werden von rechts nach links übergeben. Die Register EAX, ECX, und EDX sind reserviert für die Verwendung innerhalb der Funktion, werden also unter Umständen verändert. Rückgabewerte werden im EAX-Register zurückgegeben. Anders als bei cdecl bereinigt die aufgerufene Funktion den Stack, nicht die aufrufende Funktion. Wegen dieser Tatsache unterstützen stdcall-Funktionen keine variablen Argumentenlisten.

Beispiel (Deklaration einer stdcall-Funktion in C):

void _stdcall function(params);

Funktionen, die die stdcall-Methode benutzen, sind in Assembler-Code leicht zu erkennen, da sie vor dem Rücksprung zum aufrufenden Code den Stack immer selbst abbauen. Der x86-Befehl ret erlaubt einen optionalen Parameter, der die Größe des abzubauenden Stacks angibt.

Beispiel: Beim Rücksprung 14 Byte von Stack entfernen.

ret 14

Einzelnachweise

  1. IBM: Developing COBOL and PL/I applications for Windows, CDECL (Stand: 7.12.2008)

Wikimedia Foundation.

Игры ⚽ Нужно сделать НИР?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Cdecl — may refer to: *the cdecl calling convention on x86 architectures *the C Declare utility described in K R …   Wikipedia

  • Aufrufkonvention — Unter Aufrufkonvention (engl. calling convention) versteht man die Methode, mit der in Computerprogrammen einer Funktion Daten übergeben werden. In der Regel liegt es am Compiler, welche Konvention zum Einsatz kommt, so dass der Programmierer… …   Deutsch Wikipedia

  • X86 calling conventions — This article describes the calling conventions used on the x86 architecture.Calling conventions describe the interface of called code: * The order in which parameters are allocated * Where parameters are placed (pushed on the stack or placed in… …   Wikipedia

  • Dynamic-link library — This article is about the OS/2 and Windows implementation. For dynamic linking of libraries in general, see Dynamic linker. Dynamic link library Filename extension .dll Internet media type application/x msd …   Wikipedia

  • Соглашение вызова — или модель вызова (англ. Calling convention)  часть двоичного интерфейса приложений, которая регламентирует технические особенности вызова подпрограммы, передачи параметров, возврата из подпрограммы и передачи результата вычислений в… …   Википедия

  • FASMLIB — is a portable general purpose library for the x86 series of processors written in 32 bit assembly language. It supports FASM, MASM and NASM/YASM, on Windows and Linux. Development FASMLIB was developed by Martin Mocko (aka. vid ) in autumn 2006,… …   Wikipedia

  • DLL-Datei — Dynamic Link Library (DLL) bezeichnet allgemein eine Dynamische Bibliothek, meist bezieht sich der Begriff jedoch auf die unter dem Betriebssystem Microsoft Windows verwendete Variante. Windows DLL Dateien verwenden das auch für ausführbare… …   Deutsch Wikipedia

  • Dll-Datei — Dynamic Link Library (DLL) bezeichnet allgemein eine Dynamische Bibliothek, meist bezieht sich der Begriff jedoch auf die unter dem Betriebssystem Microsoft Windows verwendete Variante. Windows DLL Dateien verwenden das auch für ausführbare… …   Deutsch Wikipedia

  • Dynamic Link Library — Vorlage:Infobox Dateiformat/Wartung/MagischeZahl fehltVorlage:Infobox Dateiformat/Wartung/Standard fehltVorlage:Infobox Dateiformat/Wartung/Website fehlt Dynamic Link Library Dateiendung: .dll, .DLL MIME Type …   Deutsch Wikipedia

  • Dynamic link library — (DLL) bezeichnet allgemein eine Dynamische Bibliothek, meist bezieht sich der Begriff jedoch auf die unter dem Betriebssystem Microsoft Windows verwendete Variante. Windows DLL Dateien verwenden das auch für ausführbare Windows Programme… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”