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

📄 declare.asm

📁 Turbo Pascal 6.0编译器源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	mov	al,2
	test	es:[di].psFlags,pfMethod
	jz	@@1
	mov	al,4
	test	es:[di].psFlags,pfConstructor+pfDestructor
	jz	@@1
	mov	al,6
@@1:	mov	cx,es:[di].psType.ptParamCount
	jcxz	@@3
	push	di
	add	di,psType.ptParams
@@2:	push	cx
	push	ax es di
	mov	al,es:[di].ppFlags
	xor	ah,ah
	mov	bx,es:[di].ppType.Segm
	mov	di,es:[di].ppType.Offs
	mov	es,es:[bx]
	call	ParamSize
	pop	di es ax
	add	ax,cx
	pop	cx
	add	di,size TProcParam
	loop	@@2
	pop	di
@@3:	mov	dx,ax
	test	es:[di].psFlags,pfInterrupt
	jnz	@@4
	add	dx,4
	test	es:[di].psFlags,pfFar
	jz	@@4
	inc	dx
	inc	dx
@@4:	ret
StackRequired	endp

ParamSize	proc	near
	xor	dx,dx
	test	al,vfAddress
	jnz	@@3
	mov	bl,es:[di].tdType
	mov	cx,es:[di].tdSizeOf
	cmp	bl,tt8087
	jae	@@1
	cmp	bl,ttString
	je	@@2
	cmp	bl,ttPointer
	je	@@1
	cmp	bl,ttSet
	je	@@2
	cmp	cx,1
	je	@@1
	cmp	cx,2
	je	@@1
	cmp	cx,4
	jne	@@2
@@1:	inc	cx
	and	cx,0fffeh
	ret
@@2:	or	ah,ah
	jnz	@@4
	mov	dx,cx
@@3:	mov	cx,4
	ret
@@4:	or	al,vfAddress
	cmp	bl,ttSet
	jne	@@3
	mov	bx,es:[di].stBase.Segm
	mov	di,es:[di].stBase.Offs
	mov	es,es:[bx]
	mov	bx,es:[di].itBase.Segm
	mov	di,es:[di].itBase.Offs
	mov	es,es:[bx]
	add	di,size TOrdinalType
	jmp	@@3
ParamSize	endp

LocalSize	proc	near
	xor	ax,ax
	mov	dx,ax
	mov	bx,es:[di].psType.ptResult.Segm
	or	bx,bx
	jz	@@2
	test	es:[di].psFlags,pfAssembler
	jnz	@@2
	push	es di
	mov	di,es:[di].psType.ptResult.Offs
	mov	es,es:[bx]
	cmp	es:[di].tdType,ttString
	je	@@1
	sub	ax,es:[di].tdSizeOf
@@1:	pop	di es
@@2:	ret
LocalSize	endp

FlushProcMap	proc	near
	push	es di bx
	mov	ax,size TProcMap
	lea	bx,ProcMap
	Invoke	GetMemory
	pop	bx
	mov	dx,di
	xor	ax,ax
	stosw
	stosw
	dec	ax
	stosw
	mov	ax,bx
	stosw
	pop	di es
	mov	es:[di].psProcMap,dx
	ret
FlushProcMap	endp

FlushCodeMap	proc	near
	mov	ax,size TSegMap
	lea	bx,CodeMap
	Invoke	GetMemory
	xor	ax,ax
	stosw
	mov	ax,CompiledCode.Offs
	sub	ax,CodeSectStart
	stosw
	mov	ax,CodeFixups.Offs
	sub	ax,LastCodeFixup
	stosw
	mov	ax,LastTraceTable
	cmp	ax,TraceTable.Offs
	jne	@@1
	mov	ax,-1
@@1:	stosw
	mov	ax,CompiledCode.offs
	mov	CodeSectStart,ax
	mov	ax,CodeFixups.Offs
	mov	LastCodeFixup,ax
	mov	ax,TraceTable.Offs
	mov	LastTraceTable,ax
	ret
FlushCodeMap	endp

FlushConstMap		 proc near
	Invoke	WordAlignConst
	mov	ax,CompiledConst.Offs
	sub	ax,ConstSectStart
	jnz	@@1
	cmp	FirstOnConst,0
	je	@@2
@@1:	mov	FirstOnConst,0
	push	ax
	mov	ax,size TSegMap
	lea	bx,ConstMap
	Invoke	GetMemory
	xor	ax,ax
	stosw
	pop	ax
	stosw
	mov	ax,ConstFixups.Offs
	sub	ax,LastConstFixup
	stosw
	mov	ax,CurOwner
	stosw
	mov	ax,CompiledConst.Offs
	mov	ConstSectStart,ax
	mov	ConstSectStart2,ax
	mov	ax,ConstFixups.Offs
	mov	LastConstFixup,ax
@@2:	ret
FlushConstMap	endp

FlushDataMap		 proc near
	mov	ax,VarsSize
	inc	ax
	jz	@@3
	and	ax,0fffeh
	mov	VarsSize,ax
	sub	ax,DataSectStart
	jnz	@@1
	cmp	FirstOnData,0
	je	@@2
@@1:	mov	FirstOnData,0
	push	ax
	mov	ax,size TSegMap
	lea	bx,DataMap
	Invoke	GetMemory
	xor	ax,ax
	stosw
	pop	ax
	stosw
	xor	ax,ax
	stosw
	stosw
	mov	ax,VarsSize
	mov	DataSectStart,ax
@@2:	ret
@@3:	mov	ax,96
	Chain	CompileError
FlushDataMap	endp

GetTypeNoForw	proc	near
	mov	ForwardTypes,0
	call	GetTypeNoObj
	push	es di
	Invoke	GetDirective
	call	ResolveForward
	pop	di es
	ret
GetTypeNoForw	endp

GetType	proc	near
	cmp	CurrentToken,tObject
	jne	GetTypeNoObj
	jmp	ObjectType
GetType	endp

GetTypeNoObj	proc	near
	mov	al,tPacked
	Invoke	CheckToken
	Invoke	GetSymbol
	lea	bx,@@2
	Invoke	ChooseToken
	jnz	@@1
	jmp	word ptr cs:[bx+1]
@@1:	mov	ax,21
	Chain	CompileError
@@2	db	16,3
	db	t_Type
	dw	TypeName
	db	tArray
	dw	ArrayType
	db	tRecord
	dw	RecordType
	db	tCaret
	dw	PointerType
	db	tString
	dw	StringType
	db	tFile
	dw	FileType
	db	tSet
	dw	SetType
	db	tOParen
	dw	EnumType
	db	tProcedure
	dw	ProcedureType
	db	tFunction
	dw	ProcedureType
	db	t_Constant
	dw	RangeType
	db	t_Const
	dw	RangeType
	db	tMinus
	dw	RangeType
	db	tPlus
	dw	RangeType
	db	t_StdFun
	dw	RangeType
	db	tNot
	dw	RangeType
GetTypeNoObj	endp

_GetTypeName	proc	near
	Invoke	GetSymbol
	cmp	CurrentToken,t_StdType
	je	TypeName
GetTypeName	label	near
	mov	al,CurrentToken
	mov	di,_String
	cmp	al,tString
	je	@@1
	mov	di,_File
	cmp	al,tFile
	jne	@@2
@@1:	mov	es,SystemUnit
	Chain	GetToken
@@2:	Invoke	GetSymbol
	cmp	CurrentToken,t_Type
	je	TypeName
	mov	ax,12
	Chain	CompileError
_GetTypeName	endp

TypeName	proc	near
	les	di,CurrentSymbol
	mov	bx,es:[di].tsType.Segm
	mov	di,es:[di].tsType.Offs
	mov	es,es:[bx]
	Chain	GetToken
TypeName	endp

ArrayType	proc	near
	Invoke	GetToken
	mov	al,tOBracket
	Invoke	NeedToken
	xor	cx,cx
@@1:	push	cx
	call	GetBound
	pop	cx
	push	es di
	inc	cx
	mov	al,tComma
	Invoke	CheckToken
	jz	@@1
	push	cx
	mov	al,tCBracket
	Invoke	NeedToken
	mov	al,tOf
	Invoke	NeedToken
	call	GetTypeNoObj
	pop	cx
@@2:	call	_SearchUnit
	mov	bx,es:[di].tdSizeOf
	pop	di es
	push	cx dx ax
	mov	ax,es:[di].itUpperBound.W0
	sub	ax,es:[di].itLowerBound.W0
	inc	ax
	jz	@@3
	mul	bx
	jc	@@3
	mov	bx,ax
	call	_SearchUnit
	push	dx ax
	mov	ax,size TArrayType
	mov	cx,ttArray
	call	PutTypePrefix
	pop	es:[di].atBounds
	pop	es:[di].atBase
	pop	cx
	loop	@@2
	ret
@@3:	mov	ax,22
	Chain	CompileError
ArrayType	endp

RecordType	proc	near
	push	ForwardTypes PrevField FirstVar VarCount
	mov	ax,size TRecordType
	xor	bx,bx
	mov	cx,ttRecord
	call	PutTypePrefix
	mov	CurOwner,di
	mov	ax,Dictionary.Offs
	mov	es:[di].rtHash,ax
	mov	es:[di].rtFirst,0
	lea	ax,[di].rtFirst
	mov	PrevField,ax
	push	es di
	mov	ax,4
	Invoke	CreateHashTable
	mov	ax,tRecord+tEnd*256
	call	RecordSection
	pop	di es
	xor	ax,ax
	mov	CurOwner,ax
	pop	VarCount FirstVar PrevField ForwardTypes
	ret
RecordType	endp

RecordSection	proc	near
	Loc	EndingToken,byte,2
	Loc	Temp,byte,<size TExpr>
	Entry
	mov	EndingToken,ah
	Invoke	NeedToken
@@1:	mov	al,CurrentToken
	cmp	al,EndingToken
	je	@@8
	mov	al,tCase
	Invoke	CheckToken
	jz	@@2
	call	RecordGroup
	mov	al,tSemicolon
	Invoke	CheckToken
	jz	@@1
	jmp	short @@8
@@2:	Invoke	NeedIdent
	Invoke	SearchSymbol
	jnz	@@3
	cmp	al,t_Type
	jnz	@@3
	Invoke	GetToken
	jmp	short @@4
@@3:	call	RecordGroup
@@4:	mov	al,tOf
	Invoke	NeedToken
	mov	es,Dictionary.Segm
	mov	di,CurOwner
	mov	dx,es:[di].tdSizeOf
@@5:	mov	ax,dx
	xchg	ax,es:[di].tdSizeOf
	push	ax dx es di
@@6:	lea	di,Temp
	call	GetConstExpr
	mov	al,tComma
	Invoke	CheckToken
	jz	@@6
	mov	al,tColon
	Invoke	NeedToken
	mov	ax,tOParen+tCParen*256
	call	RecordSection
	pop	di es dx ax
	cmp	ax,es:[di].tdSizeOf
	jbe	@@7
	mov	es:[di].tdSizeOf,ax
@@7:	mov	al,tSemicolon
	Invoke	CheckToken
	jnz	@@8
	mov	al,CurrentToken
	cmp	al,EndingToken
	jne	@@5
@@8:	mov	al,EndingToken
	Invoke	NeedToken
	Exit
RecordSection	endp

RecordGroup	proc	near
	call	GetVarList
	mov	al,tColon
	Invoke	NeedToken
	push	CurOwner
	xor	ax,ax
	mov	CurOwner,ax
	call	GetVarType
	pop	CurOwner
	mov	TempStub.vsFlags,vfField
	xor	ax,ax
	mov	TempStub.vsScope,ax
	jmp	FillVarTypes
@@1:	mov	ax,22
	Chain	CompileError
RecordGroup	endp

ObjectType	proc	near
	push	ForwardTypes
	cmp	CurScope,0
	jne	@@1
	Invoke	GetToken
	push	bx
	mov	ax,size TObjectType
	xor	bx,bx
	mov	cx,ttObject
	call	PutTypePrefix
	pop	es:[di].otName
	mov	es:[di].otReserved3.Offs,ax
	mov	es:[di].otReserved3.Segm,ax
	mov	CurOwner,di
	mov	al,tOParen
	Invoke	CheckToken
	jnz	@@3
	call	GetTypeName
	cmp	es:[di].tdType,ttObject
	jne	@@2
	mov	al,tCParen
	Invoke	NeedToken
	push	es:[di].otReserved2
	push	es:[di].otVMTOffset
	push	es:[di].otVMTSize
	push	es:[di].tdSizeOf
	call	_SearchUnit
	jmp	short @@4
@@1:	mov	ax,148
	Chain	CompileError
@@2:	mov	ax,147
	Chain	CompileError
@@3:	xor	ax,ax
	xor	dx,dx
	push	ax
	dec	ax
	push	ax
	inc	ax
	push	ax ax
@@4:	mov	es,Dictionary.Segm
	mov	di,CurOwner
	pop	es:[di].tdSizeOf
	pop	es:[di].otVMTSize
	pop	es:[di].otVMTOffset
	pop	es:[di].otReserved2
	mov	es:[di].otParent.Offs,ax
	mov	es:[di].otParent.Segm,dx
	xor	ax,ax
	mov	es:[di].rtFirst,ax
	mov	es:[di].otReserved3.Offs,ax
	mov	es:[di].otReserved3.Segm,ax
	dec	ax
	mov	es:[di].otVMTAddr,ax
	mov	es:[di].otReserved,ax
	mov	ax,Dictionary.Offs
	mov	es:[di].rtHash,ax
	lea	ax,[di].rtFirst
	mov	PrevField,ax
	xor	ax,ax
	mov	DummyCount,ax
	push	es di
	mov	ax,4
	Invoke	CreateHashTable
	call	ObjectGroup
	mov	al,tPrivate
	Invoke	CheckToken
	jnz	@@5
	mov	PrivateFlag,t_Private
	call	ObjectGroup
	mov	PrivateFlag,0
@@5:	mov	al,tEnd
	Invoke	NeedToken
	pop	di es
	call	PutVMT
	xor	ax,ax
	mov	CurOwner,ax
	pop	ForwardTypes
	ret
ObjectType	endp

	HValue	PRIVATE,128

ObjectGroup	proc	near
@@1:	xor	cx,cx
@@2:	mov	al,@HS
	lea	di,PrivateStr
	Invoke	CompareSymbol
	jnz	@@3
	mov	CurrentToken,tPrivate
@@3:	mov	al,CurrentToken
	cmp	al,tProcedure
	je	@@5
	cmp	al,tFunction
	je	@@5
	cmp	al,tConstructor
	je	@@4
	cmp	al,tDestructor
	je	@@4
	or	cx,cx
	jnz	@@6
	cmp	al,tPrivate
	je	@@6
	cmp	al,tEnd
	je	@@6
	call	RecordGroup
	mov	al,tSemicolon
	Invoke	NeedToken
	jmp	@@1
@@4:	call	InitVMT
@@5:	call	Method
	mov	cx,-1
	jmp	@@2
@@6:	ret
ObjectGroup	endp

InitVMT	proc	near
	mov	es,Dictionary.Segm
	mov	di,CurOwner
	cmp	es:[di].otVMTSize,0
	jne	@@1
	mov	es:[di].otVMTSize,4
@@1:	ret
InitVMT	endp

Method	proc	near
	Loc	CurMethod,dword,1
	Loc	OldMethod,dword,1
	Entry
	push	ax
	Invoke	GetToken
	Invoke	NeedIdent
	Invoke	LocalSearch
	jnz	@@2
	cmp	al,t_Proc
	jne	@@1
	mov	ax,es
	cmp	ax,Dictionary.Segm
	jne	@@3
	mov	ax,es:[di].psScope
	cmp	ax,CurOwner
	jne	@@3
@@1:	mov	ax,4
	Chain	CompileError
@@2:	xor	di,di
	mov	es,di
@@3:	mov	OldMethod.Offs,di
	mov	OldMethod.Segm,es
	mov	ax,size TProcStub
	Invoke	LocalAddIdent
	Invoke	GetToken
	mov	CurMethod.Offs,di
	mov	CurMethod.Segm,es
	mov	al,PrivateFlag
	or	al,t_Proc
	mov	es:[bx].seType,al
	mov	ax,CurOwner
	mov	es:[di].psScope,ax
	mov	ax,TempDict.Offs
	mov	es:[di].psHash,ax
	mov	si,PrevField
	mov	es:[si],bx
	lea	si,[di].psType.tdNext
	mov	PrevField,si
	call	FlushProcMap
	pop	ax
	mov	ah,pfFar+pfMethod+pfConstructor
	cmp	al,tConstructor
	je	@@4
	mov	ah,pfFar+pfMethod+pfDestructor
	cmp	al,tDestructor
	je	@@4
	mov	ah,pfFar+pfMethod
@@4:	mov	es:[di].psFlags,ah
	call	GetProcHeader
	mov	al,tSemicolon
	Invoke	NeedToken
	les	di,OldMethod
	or	di,di
	jz	@@5
	cmp	es:[di].psOwner,0
	je	@@5
	call	Override
	jmp	short @@6
@@5:	call	NewMethod
@@6:	les	di,CurMethod
	mov	es:[di].psOwner,ax
	Exit

Override	proc	near
	mov	al,tVirtual
	Invoke	CheckDirective
	jnz	@@1
	les	di,OldMethod
	mov	al,es:[di].psFlags
	les	di,CurMethod
	xor	al,es:[di].psFlags
	and	al,pfConstructor+pfDestructor
	jnz	@@2
	lea	di,CurMethod
	lea	si,OldMethod
	add	[di].Offs,psType
	add	[si].Offs,psType
	Invoke	ProcCompat
	jnz	@@2
	sub	[di].Offs,psType
	sub	[si].Offs,psType
	mov	al,tSemicolon
	Invoke	NeedToken
	les	di,OldMethod
	mov	ax,es:[di].psOwner
	ret
@@1:	mov	ax,149
	Chain	CompileError
@@2:	mov	ax,131
	Chain	CompileError
Override	endp

NewMethod	proc	near
	mov	al,tVirtual
	Invoke	CheckDirective
	mov	ax,0
	jnz	@@1
	les	di,CurMethod
	test	es:[di].psFlags,pfConstructor
	jnz	@@2
	mov	al,tSemicolon
	Invoke	NeedToken
	call	InitVMT
	mov	ax,es:[di].otVMTSize
	add	es:[di].otVMTSize,4
@@1:	ret
@@2:	mov	ax,151
	Chain	CompileError
NewMethod	endp

Method	endp

PutVMT	proc	near
	mov	ax,es:[di].otVMTSize
	or	ax,ax
	jnz	@@1
	ret
@@1:	mov	dx,es:[di].tdSizeOf
	cmp	es:[di].otVMTOffset,-1
	jne	@@2
	mov	es:[di].otVMTOffset,dx
	inc	dx
	inc	dx
	mov	es:[di].tdSizeOf,dx
@@2:	push	es di
	mov	cx,ax
	lea	bx,CompiledConst
	Invoke	GetMemory
	mov	ConstPtr,di
	mov	ax,dx
	stosw
	neg	ax
	stosw
	sub	cx,4
	mov	al,-1
	rep	stosb
	pop	di es
	mov	ax,ConstMap.Offs
	mov	es:[di].otVMTAddr,ax
	push	es di
@@3:	push	di
	mov	di,es:[di].rtFirst
	jmp	short @@8
@@4:	mov	al,es:[di].seType
	mov	bl,es:[di].seName.B0
	xor	bh,bh
	lea	di,[di+size TSymbol+bx]
	and	al,not t_Private
	cmp	al,t_Var
	jne	@@5
	mov	di,es:[di].vsNext
	jmp	short @@8
@@5:	mov	si,es:[di].psOwner
	or	si,si
	jz	@@7
	mov	ax,es
	mov	bx,es:[di].psProcMap
	mov	cx,ffProc+ffPtr
	xor	dx,dx
	add	si,ConstPtr
	push	es
	mov	es,CompiledConst.Segm
	cmp	dx,es:[si].Offs
	je	@@6
	mov	es:[si].Offs,dx
	mov	es:[si].Segm,dx
	Invoke	PutConstFixup
@@6:	pop	es
@@7:	mov	di,es:[di].psType.tdNext
@@8:	or	di,di
	jnz	@@4
	pop	di
	mov	bx,es:[di].otParent.Segm
	or	bx,bx
	jz	@@9
	mov	di,es:[di].otParent.Offs
	mov	es,es:[bx]
	jmp	@@3
@@9:	call	FlushConstMap
	pop	di es
	ret
PutVMT	endp

ProcedureType	proc	near
	Invoke	GetToken
	push	TempDict.Offs
	call	GetProcHeader
	pop	TempDict.Offs
	ret
ProcedureType	endp

GetProcHeader	proc	near
	push	ax
	mov	ax,size TProcType
	mov	bx,4
	mov	cx,ttProc+emLongint*256
	call	PutTypePrefix
	xor	ax,ax
	mov	es:[di].ptResult.Offs,ax
	mov	es:[di].ptResult.Segm,ax
	mov	es:[di].ptParamCount,ax

⌨️ 快捷键说明

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