引数を付けてプロシージャを呼び出します。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