アセンブラサブプログラムの呼び出し例

標準の COBOL 呼び出し規約に従うアセンブラサブプログラムは、次のような形式をとります。

アセンブラサブプログラムは、複数のコードとデータセグメントで構成できます。 初期コードのエントリポイントが最初のコードセグメントの開始点に定義されていることを確認するか、 End 指令の後に明示的にエントリポイントのラベルを定義しているかを確認する必要があります。

注:
  • 各コードセグメントは、CODE のクラス名を持つように定義されるか、サフィックス CODE を持つ class-name を持つことが必要です。 そうでない場合は、リンカは、実行を許可するアクセス権をそのセグメントに与えることはできません
  • 動的にリンクする場合、サブプログラムのエントリポイントは、リンク時に与える .def file の中に定義されなければなりません。 たとえば、上記の .def ファイルは、次のような行を含んでいます。
    LIBRARY libname
    EXPORTS entry-point-name @1
;---------------------------------------------------------
; Example skeleton assembler subprogram
;---------------------------------------------------------
;---------------------------------------------------------
; Declare local data segment(s)
;---------------------------------------------------------

.386 
.MODEL FLAT ;
_DATA   segment dword use32 public 'DATA'
        ...
    data used by subprogram
        ...
_DATA ends

;---------------------------------------------------------
; Declare local code segment(s)
;---------------------------------------------------------

_TEXT   segment dword use32 public 'CODE'

assume cs:flat, ds:flat, ss:flat, es:flat

;---------------------------------------------------------
; Declare public entry point
;---------------------------------------------------------

PUBLIC EXAMPLE

;---------------------------------------------------------
; Declare equates for accessing params(COBOL convention)
;---------------------------------------------------------

param1 equ  ebp+8
param2  equ  ebp+12

EXAMPLE proc  near
    push  ebp              ; preserve ebp 
    mov   ebp,esp          ; address params on stack  
    push  esi              ; preserve esi, edi  
    push  edi

    ...
    program code
    ...

    mov  esi,[param1]      ; access parameter 1
    ...
    mov  esi,[param2]      ; access parameter 2 
    ...
    mov  eax,{return-code} ; set up 
                           ; return code
    ...

    pop  edi
    pop  esi               ; restored esi,edi
    pop  ebp               ; restored ebp
    ret

EXAMPLE endp

    _TEXT    ends
    end