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