⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 让你的masm支持__fastcall调用方式.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
        ELSE
          push  arg
        ENDIF
        
      ELSE
        IFIDNI  <arg>, <eax>  ;;Do not overwrite eax
          IF  reax
            line TEXTEQU %@Line
            % ECHO @FileCur(line) : ERROR! EAX register value overwritten by fastcall macro.
            .ERR
          ELSE
            push arg
          ENDIF
        ELSE
          push  arg
        ENDIF
      ENDIF
    ENDM
  ENDIF
  
  IFNB <p1>
      
    IF  @SizeStr(<p1>) GE 6
      IFIDNI  @SubStr(<p1>, 1, 5), <ADDR >
%        lea ecx, @SubStr(<p1>, 6)
        recx = -1
      ENDIF
    ENDIF
    IF  @SizeStr(<p1>) GE 8
      IFIDNI  @SubStr(<p1>, 1, 7), <OFFSET >
        mov  ecx, p1
        recx = -1
      ENDIF
    ENDIF  
    IF  @SizeStr(<p1>) GE 10
      IFIDNI  @SubStr(<p1>, 1, 9), <LROFFSET >
        mov  ecx, p1
        recx = -1  
      ENDIF
    ENDIF
      
    IF   (NOT recx)
      IF  (OPATTR (p1)) AND 00000100b  ;; Is an immediate value
        IF  (OPATTR (p1)) AND 00000001b
          mov  ecx, p1
        ELSE
          IF  p1 EQ 0
            xor ecx, ecx
          ELSEIF   p1 EQ 1
            xor ecx, ecx
            inc ecx
          ELSEIF   p1 EQ -1
            or ecx, -1        
          ELSE
            mov ecx, p1
          ENDIF
        ENDIF
        recx = -1
      ELSEIF  (OPATTR (p1)) AND 00010000b  ;; Is a register value
        IFDIFI <p1>, <ecx>
          IFIDNI <p1>, <eax>
            IF  reax
              line TEXTEQU %@Line
              % ECHO @FileCur(line) : ERROR! EAX register value has changed.
              .ERR
            ENDIF
          ENDIF
          mov ecx, p1
          recx = -1        ;; no more ecx
        ENDIF
      ELSE
        mov  ecx, p1
        recx = -1                    
      ENDIF
    ENDIF    
  ENDIF
  
  IFNB <p2>
  
    IF  @SizeStr(<p2>) GE 6
      IFIDNI  @SubStr(<p2>, 1, 5), <ADDR >
%        lea edx, @SubStr(<p2>, 6)
        redx = -1
      ENDIF
    ENDIF
    IF  @SizeStr(<p2>) GE 8
      IFIDNI  @SubStr(<p2>, 1, 7), <OFFSET >
        mov  edx, p2
        redx = -1
      ENDIF
    ENDIF
      
    IF  @SizeStr(<p2>) GE 10
      IFIDNI  @SubStr(<p2>, 1, 9), <LROFFSET >
        mov  edx, p2
        redx = -1  
      ENDIF
    ENDIF
      
    IF (NOT redx) 
      IF (OPATTR (p2)) AND 00010000b  ;; Is a register value
        IFDIFI <p2>, <edx>    ;; do not move edx onto itself
          IFIDNI  <p2>, <eax>
            IF  reax
              line TEXTEQU %@Line
              % ECHO @FileCur(line) : ERROR! EAX register value has changed.
              .ERR
            ENDIF
          ENDIF
          
          IFIDNI  <p2>, <ecx>
            IF   recx              ;; if ecx was used report error
              line TEXTEQU %@Line
              % ECHO @FileCur(line) : ERROR! ECX register value has changed.
              .ERR
            ENDIF
          ENDIF
              
          mov edx, p2
          redx = -1
        ENDIF
    
      ELSEIF (OPATTR (p2)) AND 00000100b  ;; Is an immediate value
        IF  (OPATTR (p2)) AND 00000001b
          mov  ecx, p2
        ELSE
          IF   p2 EQ 0
            xor edx, edx
          ELSEIF   p2 EQ 1
            xor edx, edx
            inc edx
          ELSEIF   p2 EQ -1
            or edx, -1
          ELSE
            mov edx, p2
          ENDIF
        ENDIF
        redx = -1
      ELSE
        mov  edx, p2  
        redx = -1        
      ENDIF
    ENDIF
  ENDIF
  
  call api
ENDM
ENDIF

;;------------------------------------------------------------------------------------
;;(MF)快速调用宏函数
;;
;;用法  :返回值 = $fastcall(函数名,参数1,参数2...)
;;
;;参数  :同fastcall
;;
;;返回值:该函数的返回值(eax)
;;
;;影响的寄存器:同fastcall
;;
;;------------------------------------------------------------------------------------
IFNDEF  $fastcall
$fastcall  MACRO  api:REQ, p1, p2, px:VARARG
  fastcall api, p1, p2, px
  EXITM  <eax>
ENDM
ENDIF

;;------------------------------------------------------------------------------------
;;(MF)快速调用函数名修饰宏
;;
;;用法  :$FcallFuncNameGen(函数名,参数个数)
;;
;;参数  :函数名,该函数参数个数
;;
;;返回值:函数的修饰名
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF  $FcallFuncNameGen
$FcallFuncNameGen  MACRO    fname:REQ, argsize:REQ
LOCAL  num
  num  TEXTEQU  %(&argsize& * 4)
  EXITM  @CatStr(<@>, <fname>, <@>, %num)
ENDM
ENDIF

;;------------------------------------------------------------------------------------
;;(MF)定义一个快速调用的函数头
;;
;;用法  :[$]BeginfcProc(函数名,参数个数[,距离]) Uses 寄存器列表 除第1,2参数外其他参数
;;
;;参数  :不用多说
;;
;;返回值:无需操心
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF  $BeginfcProc
$BeginfcProc  MACRO  fname:REQ, argsize:REQ, distance
  fname  TEXTEQU  $FcallFuncNameGen(fname, argsize)
  IFB  <distance>
    EXITM  <$FcallFuncNameGen(fname, argsize) PROC SYSCALL >
  ELSE
    EXITM  <$FcallFuncNameGen(fname, argsize) PROC &distance& SYSCALL >
  ENDIF
ENDM
BeginfcProc  TEXTEQU  <$BeginfcProc>
ENDIF

;;------------------------------------------------------------------------------------
;;(MF)快速调用的函数结尾, 必须和$BeginfcProc成对使用
;;
;;用法  :$EndfcProc(函数名,参数个数)
;;
;;参数  :不用多讲
;;
;;返回值:无需操心
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF  $EndfcProc
$EndfcProc  MACRO  fname:REQ, argsize:REQ
  EXITM  <$FcallFuncNameGen(fname, argsize)  ENDP>
ENDM
EndfcProc  TEXTEQU  <$EndfcProc>
ENDIF

;;------------------------------------------------------------------------------------
;;(MA)快速调用函数的专用返回宏
;;
;;
;;用法  :fcret  返回值, 参数个数
;;
;;参数  :同return, 会自动修正清栈参数
;;
;;
;;影响的寄存器:eax(必须)
;;
;;------------------------------------------------------------------------------------
IFNDEF  fcret
fcret  MACRO  retv, argsize:REQ
LOCAL  num
  IF  argsize  GT 2
    num  TEXTEQU  %(&argsize& - 2)
  ELSE
    num  TEXTEQU  <0>
  ENDIF
  return  retv, num
ENDM
ENDIF

;;------------------------------------------------------------------------------------
;;用于声明一个外部的fastcall函数
;;
;;用法  :$FcProto(函数名,参数个数)
;;
;;参数  :不用多说
;;
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF  $FcProto
$FcProto  MACRO  fname:REQ, argsize:REQ
  fname  TEXTEQU  $FcallFuncNameGen(fname, argsize)
  EXITM  @CatStr(<EXTERNDEF SYSCALL >, <$FcallFuncNameGen(fname, argsize)>, <:PROC>)
ENDM
FcProto  TEXTEQU  <$FcProto>
ENDIF

;;End of File
ENDIF ;;FastCall.inc 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -