CallConv.Inc
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
- ;****************************CallConv.Inc************************************
- ;
- ; Copyright (c) 1990-1995, Microsoft Corp. All rights reserved.
- ;
- ;****************************************************************************
- ;****************************Public Macro************************************
- ;
- ; ComposeInst Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9
- ;
- ; This macro simply concatenates all arguments into one string.
- ;
- ;
- ;****************************************************************************
- ComposeInst macro Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9
- &Inst p1&p2&p3&p4&p5&p6&p7&p8&p9
- endm
- ;****************************Public Macro************************************
- ;
- ; CountArg cCount,ArgList
- ;
- ; This macro count the number of arguments in the ArgList and returns
- ; the value in cCount.
- ;
- ;
- ;****************************************************************************
- CountArg macro cCount,ArgList
- cCount = 0
- irp arg,<ArgList>
- cCount = cCount+1
- endm
- endm
- ;****************************Public Macro************************************
- ;
- ; RevPush ArgList,cCount
- ;
- ; This macro pushes the arguments in ArgList in the reverse order
- ; and returns the number of arguments in cCount.
- ;
- ;
- ;****************************************************************************
- RevPush macro ArgList,cCount
- Local index,x
- CountArg cCount,<ArgList>
- index = cCount
- rept cCount
- x = 0
- irp arg,<ArgList>
- x = x+1
- ife index-x
- push arg
- exitm
- endif
- endm
- index = index-1
- endm
- endm
- ;****************************Public Macro************************************
- ;
- ; The following sections contain calling-convention related macros for:
- ;
- ; PUBLICP Func,N
- ; to define a public label
- ;
- ; EXTRNP Func,N,Thunk
- ; to define a external near label
- ;
- ; LABELP Func,N
- ; to label an address as a routine entry point
- ;
- ; stdPROC Func,N,ArgList
- ; to declare a routine header
- ;
- ; ProcName Name,Func,N
- ; to rename a function Func to Name. Using it in conjunction with
- ; normal function declaration (with the new name) will solve an error
- ; caused by a long parameter list routine that exhausts page width.
- ;
- ; stdRET Func
- ; to return from Func routines (declared with stdPROC or ProcName.)
- ;
- ; stdENDP Func
- ; to declare the end of routine (declared with stdPROC or ProcName.)
- ;
- ; endMod Func
- ; to declare the end of module with an entry point at Func (declared
- ; with stdPROC or ProcName.)
- ;
- ; stdCall Func,ArgList
- ; to call to a routine--Func--with the arguments pushed on the stack
- ;
- ; MovAddr dest,Func,n
- ; to move the address of the routine--Func--into dest.
- ;
- ; Note that for the standard calling convention all the function names,
- ; Func, are automatically converted to Func@N where N is the number of
- ; bytes (decimal) in the argument list.
- ;
- ;
- ;****************************************************************************
- if @Version GE 600
- option nokeyword:<stdcall>
- endif
- PUBLICP macro Func,N
- ifb <N>
- public Func&@0
- else
- PUBLICP2 Func,%(N*4)
- endif
- endm
- PUBLICP2 macro Func,N
- public Func&@&N
- endm
- EXTRNP macro Func,N,Thunk,FastCall
- ifb <N>
- IFNDEF Func&@0
- extrn Func&@0:NEAR
- ENDIF
- else
- ifb <FastCall>
- ifb <Thunk>
- EXTRNP2 Func,%(N*4)
- else
- EXTRNTHUNK Func,%(N*4)
- endif
- else
- cFCall&@&Func equ (N*4)
- ifb <Thunk>
- EXTRNP2 &@&Func,%(N*4)
- else
- EXTRNTHUNK &@&Func,%(N*4)
- endif
- endif
- endif
- endm
- EXTRNP2 macro Func,N
- IFNDEF Func&@&N
- extrn Func&@&N:NEAR
- ENDIF
- endm
- EXTRNTHUNK macro Func,N
- IFNDEF __imp_&Func&@&N
- extrn __imp_&Func&@&N:DWORD
- ENDIF
- endm
- LABELP macro Func,N
- ifb <N>
- Func&@0 label near
- else
- LABELP2 Func,%(N*4)
- endif
- endm
- LABELP2 macro Func,N
- Func&@&N label near
- endm
- ProcName macro Name,Func,N
- ifb <N>
- cByte&Func equ 0
- Name equ <Func&@0>
- else
- cByte&Func equ N
- Name equ <Func&@&N>
- endif
- endm
- stdPROC macro Func,N,ArgList
- ProcName Func,Func,%(N*4)
- Func proc ArgList
- endm
- cPublicProc macro Func,N,ArgList
- align dword
- PUBLICP Func,N
- ifb <N>
- stdPROC Func,0,<ArgList>
- else
- stdPROC Func,N,<ArgList>
- endif
- endm
- ProcNameF macro Name,Func,N,M
- cByte&Func equ M
- cFCall&Func equ N
- Name equ <Func&@&N>
- endm
- stdPROCF macro Func,N,ArgList
- if N gt 2
- ProcNameF Func,Func,%(N*4),%((N-2)*4)
- else
- ProcNameF Func,Func,%(N*4),0
- endif
- Func proc ArgList
- endm
- cPublicFastCall macro Func,N,ArgList
- align dword
- PUBLICP &@&Func,N
- ifb <N>
- stdPROCF &@&Func,0,<ArgList>
- else
- stdPROCF &@&Func,N,<ArgList>
- endif
- endm
- fstRET macro Func
- ret cByte&@&Func
- endm
- stdRET macro Func
- ret cByte&Func
- endm
- cPublicFpo macro FpoLocals, FpoParams
- .FPO ( FpoParams, FpoLocals, 0, 0, 0, 0 )
- endm
- fstENDP macro Func
- &@&Func endp
- endm
- stdENDP macro Func
- Func endp
- endm
- endMod macro Func
- end Func
- endm
- stdCallCall macro Func,N
- IFDEF __imp_&Func&@&N
- call dword ptr [__imp_&Func&@&N]
- ELSE
- call Func&@&N
- ENDIF
- endm
- stdCall macro Func,ArgList
- Local Bytes
- RevPush <ArgList>,Bytes
- Bytes = Bytes*4
- stdCallCall Func,%(Bytes)
- endm
- fstCall macro Func,ArgList
- Local Bytes
- RevPush <ArgList>,Bytes
- Bytes = Bytes*4
- if Bytes eq 0
- stdCallCall &@&Func,%cFCall&@&Func
- else
- ; must have 2 register params
- stdCallCall &@&Func,%(Bytes+8)
- endif
- endm
- MovAddr macro dest,addr,n
- ComposeInst <mov >,dest,<,offset FLAT:>,addr,<@>,n
- endm