INVOKE (CALL)

引数を付けてプロシージャを呼び出します。CALL 命令の拡張構文でも同じことを記述できます。

構文    INVOKE    label [lang] [, args,...]
例    INVOKE    FUNC1 C, AX, BX, word ptr [SI]
    INVOKE    FUNC2, FAR PTR ADDR1

label には、呼び出し先を指定します。

lang には、言語モデルを指定します。これにより、プロシージャ名や引数の位置などの呼び出し規約が決まります。

args には、レジスタ名やアドレス式など、アセンブラの式を指定します。args はカンマで区切っていくつでも指定できます。

INVOKE 文を記述すると、引数に応じて必要な数の PUSH 命令が生成された後、CALL 命令で label が呼び出されます。さらに、言語モデルが C または SYSCALL の場合は、CALL 命令の後にスタックレジスタを復元するコード (add sp,n) が生成されます。引数がスタックに積まれる順序は、言語モデルによって異なります。

たとえば、次のようなコードが生成されます。

例1
; ソースコード
    INVOKE    FUNC1 C, AX, BX, WORD PTR [SI]

; 生成コード(アセンブルリスト)
    pushw    WORD PTR [si]    ; 0013  FF 34
    pushw    bx    ; 0015  53
    pushw    ax    ; 0016  50
    call    NEAR PTR FUNC1    ; 0017  E8 EC FF
    add    sp,6h    ; 001A  83 C4 06
例2
; ソースコード
    INVOKE    FUNC1 PASCAL, AX, BX, WORD PTR [SI]

; 生成コード(アセンブルリスト)
    pushw    ax    ; 0013  50
    pushw    bx    ; 0014  53
    pushw    WORD PTR [si]    ; 0015  FF 34
    call    NEAR PTR FUNC1    ; 0017  E8 EC FF

参照 PROTOPROC

[目次]