Rational Developer for System z
PL/I for Windows, Version 7.6, プログラミング・ガイド

STDCALL 規則の使用例

以下の例は、わかりやすく例示するためにのみ記載されたものです。これらの例では、ユーザーがアセンブラーのプログラミングに習熟していることが前提になっています。これらの例では、スタックはページの下方へ伸びていきます。また、ESP は常に、スタックの上部を指します。

次の呼び出しでは、a, b, および c は 32 ビットの整数であり、func は 2 つのローカル変数 x および y (両方とも 32 ビットの整数) を持ちます。

  m = func(a,b,c)

FUNC に対する呼び出しのスタックは次のようになります。

                                     スタック

                           .------------------------.       上位メモリー
                           |           c            |
                           |------------------------|
                           |           b            |
                           |------------------------|
                           |           a            |
                           |------------------------|
                           |     呼び出し側の EIP     |
                           |------------------------|
                           |     呼び出し側の EBP     |
           EBP  ------>    |------------------------|
                           |           x            |
                           |------------------------|
                           |           y            |
                           |------------------------|   <-.
                           |       保管 EDI          |     |
                           |------------------------|     | これらは、この
                           |       保管 ESI          |     | 関数で使用される
                           |------------------------|     | 場合のみプッシュ
                           |       保管 EBX          |     | されます。
           ESP  ------>    .------------------------.   <-.
                                                            下位メモリー

スタック上にこの活動化レコードを作成するのに使用される命令は、呼び出し側では次のようになります。

  PUSH c
  PUSH b
  PUSH a
  CALL _func@12
    .
    .
  MOV  m, EAX
    .
    .

呼び出し先では、コードは次のようになります。

_func@12 PROC
         PUSH    EBP
         MOV     EBP, ESP           ; Allocating 8 bytes of storage
         SUB     ESP, 8             ;  for two local variables.
         PUSH    EDI                ; These would only be
         PUSH    ESI                ;  pushed if they were used
         PUSH    EBX                ;  in this function.
         .
         .
         MOV     EAX, [EBP - 8]    ; Load y into EAX
         MOV     EBX, [EBP + 12]   ; Load b into EBX
         .
         .
         XOR     EAX, EAX           ; Zero the return value
         POP     EBX                ; Restore the saved registers
         POP     ESI
         POP     EDI
         LEAVE                      ; Equivalent to  MOV   ESP, EBP
                                    ;                POP   EBP
         RET     0CH
_func@12 ENDP

保管レジスター・セットは EBX、ESI、および EDI です。

構造体はスタック上には戻されません。呼び出し側は、戻される構造体が置かれるアドレスを、最初の隠しパラメーター字句としてプッシュします。 構造体を戻す関数は、すべてのパラメーターが、構造体が戻されない場合のパラメーターよりも、EBP から 4 バイト遠くに 離れるように注意する必要があります。戻される構造体のアドレスは、EAX に戻されます。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)