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

📄 macros.asm

📁 汇编语言的FFT算法。速度还比较快
💻 ASM
📖 第 1 页 / 共 2 页
字号:
EnableError =0    ;Uncomment to report error messages
RegStr TEXTEQU <eax,ebx,ecx,edx,edi,esi,ebp,esp>
Random TEXTEQU <GENERIC_READ or GENERIC_WRITE>
Input  EQU <GENERIC_READ>
Ouput  EQU <GENERIC_WRITE>

IFDEF EnableError
.DATA
Align 4
	err2	DB "Error in "
	err3	DB 15 DUP(0)
ENDIF

.DATA?
Align 4
CurrentDC 	DD ?
WindowH 	DD ?
String 		DB 256 DUP (?)
pxx 		DD ?
pyy 		DD ?
FindFileHnd DD ?
HeapHnd     DD ?
IFDEF EnableError
	err1	DD ?
ENDIF	
BrRect RECT <?>  ; BrRect:RECT

.CODE
;---------------------------------------------------------------------------------;
SetDC Macro hWindow:req,HanDC 		;HanDC Optional
		mov WindowH,eax
	IFNB <HanDC>
		mov CurrentDC,HanDC
	ELSE
		Invoke GetDC,hWindow
		mov CurrentDC,eax
	ENDIF
EndM

;---------------------------------------------------------------------------------;
DelDC Macro 
		 Invoke ReleaseDC,WindowH,CurrentDC
EndM

;---------------------------------------------------------------------------------;
IsMMReg Macro reg1:req
Local reg2,reg3
	reg3 TEXTEQU <0>
	%FOR reg2,<MM0,MM1,MM2,MM3,MM4,MM5,MM6,MM7>	;RegStr
	;%echo reg2,<reg1>
		IFIDN <reg2>,<reg1>
			reg3 TEXTEQU <1>
			EXITM <1>
		ENDIF
	EndM
	EXITM <reg3>
EndM

;---------------------------------------------------------------------------------;

IsReg Macro reg1:req
Local reg2,reg3
	reg3 TEXTEQU <0>
	%FOR reg2,<eax,ebx,ecx,edx,esi,edi,esp,ebp>	;RegStr
	;%echo reg2,<reg1>
		IFIDN <reg2>,<reg1>
			reg3 TEXTEQU <1>
			EXITM <1>
		ENDIF
	EndM
	EXITM <reg3>
EndM

;---------------------------------------------------------------------------------;
Len Macro Stri:req,Lout        	;out ebx=length
    IF IsReg(Stri)
	    IFDIFI <Stri>, <edi>
            mov edi,Stri
        ENDIF
    ELSE
        mov edi,Offset Stri
    ENDIF
    xor ebx,ebx
    xor ecx,ecx
    xor eax,eax
    dec ecx
    sub ebx,2
 	repne scasb
 	sub ebx,ecx
 	IFNB <Lout>
 		IFDIFI <Lout>,<ebx>
 			mov Lout,ebx
 		ENDIF
 	ENDIF
 EndM
 
;---------------------------------------------------------------------------------;
Print Macro xx:=<0>,yy:=<0>,pp,HDC:=<CurrentDC> ;:=<req>
Local pText
.DATA
IF IsReg(pp)
ELSE
pText DB pp,0
ENDIF
.CODE
	IF IsReg(pp)
		IFDIFI <pp>,<eax>
			mov eax,pp
		ENDIF
		HexToStr
		mov esi,edi
		Len edi
		Invoke TextOut,HDC,xx,yy,esi,ebx	;Sizeof pText-1
	ELSE
    	Invoke TextOut,HDC,xx,yy,Addr pText, Sizeof pText-1
    ENDIF
EndM

;---------------------------------------------------------------------------------;
PrintStr Macro xx:=<0>,yy:=<0>,pStr,Length,HDC:=<CurrentDC>
	IFB <Length>
		IFNB <pStr>
			IF IsReg(pStr)
				push pStr
				Len pStr,ebx
				pop pStr
				Invoke TextOut,HDC ,xx,yy,pStr,ebx
			ELSE
				Len pStr,ebx
				Invoke TextOut,HDC ,xx,yy,Addr pStr,ebx
			ENDIF
		ELSE
			Len edi
			Invoke TextOut,HDC,xx,yy,edi,ebx
		ENDIF
	ELSE
		IFNB <pStr>
			IF IsReg(pstr)
				Invoke TextOut,HDC ,xx,yy,pStr,Length
			ELSE
				Invoke TextOut,HDC ,xx,yy,pStr,Length
			ENDIF
		ELSE
			Invoke TextOut,HDC ,xx,yy,edi,Length
		ENDIF
	ENDIF
EndM

;---------------------------------------------------------------------------------;
PrintEM Macro mBoxStr
Local pem
.DATA
pem DB mBoxStr,0
.CODE
		Invoke MessageBox,NULL,Addr pem,cStr("ERROR!"),MB_OK or MB_ICONERROR 
EndM

;---------------------------------------------------------------------------------;
UpCurPos Macro ucp:REQ,HDC:=<CurrentDC>			; ucp 1=true , 0=false
		IFIDNI <ucp>,<1>
  	 			Invoke GetTextAlign,HDC
  	 			test eax,1
  	 			jnz uup
  	 			or eax,1
  	 			Invoke SetTextAlign,HDC,eax
uup:
  	 	ELSE
  	 			Invoke GetTextAlign,HDC
  	 			test eax,1
  	 			jz uup2
  	 			and eax,0fffffffeh
  	 			Invoke SetTextAlign,HDC,eax
uup2:
  	 	ENDIF
EndM

;---------------------------------------------------------------------------------;
Line Macro lx1,ly1,lx2:req,ly2:req,HDC:=<CurrentDC>		;x1,y1 not req. or x1 & y1 both should be given
	IFNB <lx1>
		IFNB <ly1>
		  Invoke MoveToEx,HDC ,lx1,ly1,NULL
		ENDIF
	ENDIF
  		Invoke LineTo,HDC,lx2,ly2
EndM

;---------------------------------------------------------------------------------;
LinePoly Macro pPoints:req,pTypes:req,Count:req,HDC:=<CurrentDC> ;points,bytes,int
		Invoke PolyDraw,HDC,pPoints,pTypes,Count
EndM

;---------------------------------------------------------------------------------;
LineToPoly Macro pPoints:req,Count:req,HDC:=<CurrentDC>		;points,int
		Invoke Polyline,HDC ,pPoints,Count
EndM

;---------------------------------------------------------------------------------;
Circle Macro x:req,y:req,rad:req,y2,HDC:=<CurrentDC>	; ifnb y2 then x1,y1,x2,y2
	IFNB <y2>
		Invoke Ellipse,HDC,x,y,rad,y2
	ELSE
		Invoke Ellipse,HDC,x-rad,y-rad,x+rad,y+rad
	ENDIF
EndM

;---------------------------------------------------------------------------------;
Box Macro x1:req,y1:req,x2:req,y2:req,col,hBrush,HDC:=<CurrentDC>;if hBrush --> no col
		mov ebx,Offset BrRect
		mov [ebx].RECT.left,x1
		mov [ebx].RECT.top,y1
		mov [ebx].RECT.right,x2
		mov [ebx].RECT.bottom,y2
   	IFNB <hBrush>
   		Invoke FillRect,HDC,Addr BrRect,hBrush
   	ELSE
		Invoke CreateSolidBrush,col
		mov edi,eax
		Invoke FillRect,HDC,Addr BrRect,eax
		Invoke DeleteObject,edi
	ENDIF
EndM

;---------------------------------------------------------------------------------;
ErrorCheck Macro ErrTitle:req
Local err4
.DATA
err4	DB ErrTitle,0
.CODE
	IFDEF EnableError
	  .If eax==0
	        push eax
	  		mov esi,Offset err4
	  		mov ecx,Sizeof err4
	  		call ErrorProc
	  		pop eax
	  .EndIf
	ENDIF
EndM

IFDEF EnableError
ErrorProc Proc
.CODE
		mov edi,Offset err3
		rep movsb
		Invoke GetLastError
		Invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,NULL,\
    			eax,0,Addr err1,0,NULL 
		Invoke MessageBox,NULL,err1,Addr err2,MB_OK or MB_ICONERROR
		ret
ErrorProc EndP
ENDIF
;---------------------------------------------------------------------------------;
cStr Macro CCstr:VARARG
Local CCstr2
.DATA
CCstr2 DB CCstr,0
.CODE
   EXITM <Offset CCstr2>
EndM
;---------------------------------------------------------------------------------;
cStr2 Macro CCstr:VARARG
Local CCstr2
.DATA
CCstr2 DB CCstr,0
.CODE
   EXITM <Offset CCstr2>
EndM

;---------------------------------------------------------------------------------;
Dim Macro VarName:req	;out 'dd' var
Local dvar
.DATA?
VarName DD ?
.CODE
	EXITM <VarName>
EndM

;---------------------------------------------------------------------------------;
HexToStr Macro  HTS2:=<eax>				 ;in  eax=num
Local hts
	IFNB <HTS2>
		IFDIFI <HTS2>,<eax>
			mov eax,HTS2
		ENDIF
	ENDIF
 		mov edi,Offset String        ;out esi=offset string
 		mov ecx,10					 ;modified regs edi
 		add edi,9					 ;              ecx
 		mov ebx,10					 ;              ebx
hts:    mov edx,0					 ;              edx
        div ebx						 ;				esi
        add dl,48					 ;				eax
        mov [edi],dl
        sub edi,1
        loop hts
        mov edi,Offset String
        mov byte Ptr[edi+10],0
EndM

;---------------------------------------------------------------------------------;
Ddata Macro var:REQ,ddta:VARARG
  IFNB <ddta>	
   .DATA
    var		DD ddta
  ELSE
   .DATA?
    var 	DD ?
  ENDIF
  .CODE
EndM

;---------------------------------------------------------------------------------;
@var Macro var:REQ,ddta:VARARG
  IFNB <ddta>	
   .DATA
    var2		DD ddta
  ELSE
   .DATA?
    var2 	DD ?
  ENDIF
  .CODE
  EXITM <var2>
EndM

;---------------------------------------------------------------------------------;
InkT Macro col,HandleDC:=<CurrentDC>			;HandleDC optional
		Invoke SetTextColor,HandleDC,col
EndM

;---------------------------------------------------------------------------------;

⌨️ 快捷键说明

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