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

📄 masm.inc

📁 內存大小測試程序,可以檢測安裝內存的大小.
💻 INC
字号:
;' $Header:   P:/PVCS/MAX/INC/MASM.INV   1.0   05 Sep 1995 13:26:40   HENRY  $
;
; (C) Copyright 1987-2001 Qualitas, Inc.  All rights reserved.
;
; MASM.INC
;
; MASM Macros
;

	include INTRNATL.INC	; Include language-specific EQUates

.xcref REGSAVE,REGREST,NPROC,NPPROC,FPROC,FPPROC,MEND,REPMOVSB,MJ,POPFF
.xcref		       PPROC,NPPROCE
.xcref FCALL,OLDINT,REPMOVSF,SMAX,SMIN,UMAX,UMIN
	 if1
REGSAVE macro	LIST		; Register save macro

	irp	XX,<LIST>
	push	XX
	endm

	endm			; REGSAVE


REGREST macro	LIST		; Register restore macro

	irp	XX,<LIST>
	pop	XX
	endm

	endm			; REGREST


NPROC	macro	@PROC,@T1,@T2,@T3,@T4,@T5,@T6,@T7,@T8,@T9,@T10
	subttl	@PROC Procedure @T1 @T2 @T3 @T4 @T5 @T6 @T7 @T8 @T9 @T10
	page
@PROC	proc	near
	endm			; NPROC


PPROC	macro	@PROC,@T1,@T2,@T3,@T4,@T5,@T6,@T7,@T8,@T9,@T10
	subttl	@PROC Procedure @T1 @T2 @T3 @T4 @T5 @T6 @T7 @T8 @T9 @T10
	page
	public	@PROC
@PROC	proc
	endm			; PPROC


NPPROC	macro	@PROC,@T1,@T2,@T3,@T4,@T5,@T6,@T7,@T8,@T9,@T10
	subttl	@PROC Procedure @T1 @T2 @T3 @T4 @T5 @T6 @T7 @T8 @T9 @T10
	page
	public	@PROC
@PROC	proc	near
	endm			; NPPROC


NPPROCE macro	@PROC,@T1,@T2,@T3,@T4,@T5,@T6,@T7,@T8,@T9,@T10
	subttl	@PROC Procedure @T1 @T2 @T3 @T4 @T5 @T6 @T7 @T8 @T9 @T10
	page
	even
	public	@PROC
@PROC	proc	near
	endm			; NPPROCE


FPROC	macro	@PROC,@T1,@T2,@T3,@T4,@T5,@T6,@T7,@T8,@T9,@T10
	subttl	@PROC Procedure @T1 @T2 @T3 @T4 @T5 @T6 @T7 @T8 @T9 @T10
	page
@PROC	proc	far
	endm			; FPROC


FPPROC	macro	@PROC,@T1,@T2,@T3,@T4,@T5,@T6,@T7,@T8,@T9,@T10
	subttl	@PROC Procedure @T1 @T2 @T3 @T4 @T5 @T6 @T7 @T8 @T9 @T10
	page
	public	@PROC
@PROC	proc	far
	endm			; FPPROC


MEND	macro	@START

	if1
%OUT Pass 1 complete
	else
%OUT Pass 2 complete
	endif

	end	@START

	endm			; MEND


REPMOVSB macro	 DIR
	local	L1,L2

	pushf

	ifb	<DIR>
	shr	cx,1		; Move forwards
	jnc	L1

	movsb
L1:
    rep movsw

	else
	ifdif	<DIR>,<STD>
%OUT Invalid REPMOVSB argument DIR.
	else

	dec	si
	dec	di

	shr	cx,1		; Move backwards
	jz	L1
    rep movsw
L1:
	jnc	L2

	inc	si
	inc	di
	movsb
L2:
	endif			; IFDIF
	endif			; IFB
	POPFF

	endm			; REPMOVSB


REPMOVSF macro	 DIR
	local	L1,L2

	ifb	<DIR>
	shr	cx,1		; Move forwards
	jnc	L1

	movsb
L1:
    rep movsw

	else
	ifdif	<DIR>,<STD>
%OUT Invalid REPMOVSF argument DIR.
	else

	dec	si
	dec	di

	shr	cx,1		; Move backwards
	jz	L1
    rep movsw
L1:
	jnc	L2

	inc	si
	inc	di
	movsb
L2:
	endif			; IFDIF
	endif			; IFB

	endm			; REPMOVSF


MJ	macro	CC,LAB,DEB	; Macro for long jumps
	local	L1

MJ_NOT	=	0

	irpc	X,<CC>
	ifidn	<X>,<n>
MJ_NOT	=	1
	else
	ifidn	<X>,<N>
MJ_NOT	=	1
	endif			; IFIDN
	endif			; IFIDN
	endm			; IRP

	if	MJ_NOT		; If original jump is a NOT

	irpc	XX,<CC>
	ife	MJ_NOT
	j&&XX	short L1
	else
MJ_NOT	=	MJ_NOT-1
	endif			; IFE
	endm			; IRP

	else
	jn&CC	short L1
	endif			; IF

	ifnb	<DEB>
	int	03h		;; Call debugger
	endif			; IFNB

	jmp	LAB
L1:
	endm			; MJ


SMIN	macro	A,B		; A <== signed minimum of A and B
	local	L1

	cmp	A,B
	jle	L1

	mov	A,B
L1:
	endm			; SMIN


UMIN	macro	A,B		; A <== unsigned minimum of A and B
	local	L1

	cmp	A,B
	jbe	L1

	mov	A,B
L1:
	endm			; UMIN


SMAX	macro	A,B		; A <== signed maximum of A and B
	local	L1

	cmp	A,B
	jge	L1

	mov	A,B
L1:
	endm			; SMAX


UMAX	macro	A,B		; A <== unsigned maximum of A and B
	local	L1

	cmp	A,B
	jae	L1

	mov	A,B
L1:
	endm			; UMAX


POPFF	macro
	local	L1,L2

	jmp	short L2
L1:
	iret
L2:
	push	cs
	call	L1

	endm			; POPFF


OLDINT	macro	NN

	pushf			;; Pass flags as in INT call
	cli			;; Duplicate INT calling environment
	call	OLDINT&NN&_VEC	;; Call original interrupt handler

	endm			;; OLDINT


FCALL	macro	NAME

	push	cs
	call	near ptr NAME

	endm			; FCALL


.xcref DWALIGN
DWALIGN macro	OFF,BYT 	; Align up to word boundary
	local	BYT2

ifnb <BYT>
BYT2	equ	BYT
else
BYT2	equ	0
endif

	ALIGNCOM OFF,BYT2,2

	endm			; DWALIGN

.xcref DDALIGN
DDALIGN macro	OFF,BYT 	; Align up to dword boundary
	local	BYT2

ifnb <BYT>
BYT2	equ	BYT
else
BYT2	equ	0
endif

	ALIGNCOM OFF,BYT2,4

	endm			; DDALIGN

.xcref DPALIGN
DPALIGN macro	OFF,BYT 	; Align up to para boundary
	local	BYT2

ifnb <BYT>
BYT2	equ	BYT
else
BYT2	equ	0
endif

	ALIGNCOM OFF,BYT2,16

	endm			; DPALIGN

.xcref ALIGNCOM
ALIGNCOM macro	OFF,BYT,N	; Common alignment macro
	local	LBL,M

LBL	label	byte		; Anchor ourselves
M	equ	((LBL-OFF-BYT) mod N) ; Compute difference modulo alignment
if M				; If non-zero 'cause MASM doesn't handle 0 dup
	db	(N-M) dup (90h) ; Spit out NOPs
endif				; IF
	endm			; ALIGNCOM


DOT386SUB macro CSEG,TYP

% CSEG	ends
.386&TYP
% CSEG	segment

	endm			; DOT386SUB


DOT386	macro	TYP		; TYP is blank or p

% DOT386SUB @CurSeg,TYP

	endm			; DOT386


LOG2	macro	NAM,VAL
	local	CNT,LVAL

;; Calculate log base 2 of VAL and store in NAM

NAM	=	-1		; Initialize count
LVAL	=	VAL

	rept	32		; Maximum # bits
if LVAL
NAM	=	NAM+1		; Count in another bit
LVAL	=	LVAL shr 1	; ...and shift it out
endif				; IF LVAL
	endm			; RPT 32

	endm			; LOG2


MTEST	macro	NAM,FLG
	local	LCL_FLG,INCBYTE

;; Convert a TEST by mask on a memory location to an
;; equivalent TEST by a narrower mask on a byte.

INCBYTE =	0
LCL_FLG =	FLG

	rept	4
ife (0FFh and LCL_FLG)

LCL_FLG =	LCL_FLG shr 8
INCBYTE =	INCBYTE+1

endif
	endm			; REPT 4

	test	byte ptr NAM[INCBYTE],LCL_FLG

	endm			; MTEST


lclPROLOG macro LCLSTRUC	; Procedure beginning

if @WordSize eq 4
	push	ebp		; Prepare to address the stack
if (type lcl&LCLSTRUC)
	sub	esp,type lcl&LCLSTRUC ; Make room for local vars
endif
	mov	ebp,esp 	; Hello, Mr. Stack
else
	push	bp		; Prepare to address the stack
if (type lcl&LCLSTRUC)
	sub	sp,type lcl&LCLSTRUC ; Make room for local vars
endif
	mov	bp,sp		; Hello, Mr. Stack
endif

	endm			; lclPROLOG


lclEPILOG macro LCLSTRUC	; Procedure ending

if @WordSize eq 4
if (type lcl&LCLSTRUC)
	lea	esp,[esp + (type lcl&LCLSTRUC)] ; Strip from stack
				; without affecting flags
endif
	pop	ebp		; Restore
else
if (type lcl&LCLSTRUC)
	lea	sp,[esp + (type lcl&LCLSTRUC)] ; Strip from stack
				; without affecting flags
endif
	pop	bp		; Restore
endif
	ret	type arg&LCLSTRUC ; Return to caller, popping arguments

	endm			; lclEPILOG


	endif			; IF1 ******************************


⌨️ 快捷键说明

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