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

CDECL 規則の使用例

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

次の呼び出しを考えてみます。

  m = func(a,b,c);

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

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

                                     スタック

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

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

  PUSH c
  PUSH b
  PUSH a
  CALL _func
    .
    .
  ADD  ESP, 12   : cleaning up the parameters
    .
    .
  MOV  m, EAX
    .
    .

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

_func PROC
      PUSH    EBP
      MOV     EBP, ESP           ; Allocating 8 bytes of storage
      SUB     ESP, 08H           ;  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
_func ENDP

保管レジスター・セットは EBX、ESI、および EDI です。構造体が値パラメーターとして 受け渡され、構造体のサイズが 5、6、7、または 8 バイトより大きい場合、戻り値を置くアドレスは、隠しパラメーターとして受け渡され、アドレスは EAX に戻されます。


Terms of use | Feedback

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