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

📄 expr.asm

📁 Turbo Pascal 6.0编译器源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	Invoke	GetTypeName
	mov	bx,di
	pop	di
	cmp	es:[bx].tdType,ttObject
	jne	@@1
	mov	al,tPoint
	Invoke	CheckToken
	jz	@@7
@@1:	push	es bx
	mov	al,tOParen
	Invoke	NeedToken
	call	GetExpr
	mov	al,tCParen
	Invoke	NeedToken
	mov	al,es:[bx].tdType
	mov	dx,es:[bx].tdSizeOf
	pop	bx es
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	cmp	[di].exLocation,elMemory
	jne	@@3
	test	[di].exMisc,efReadOnly
	jnz	@@3
	or	dx,dx
	jz	@@2
	cmp	dx,es:[bx].tdSizeOf
	jne	@@3
@@2:	mov	al,es:[bx].tdModifier
	mov	[di].exModifier,al
	ret
@@3:	cmp	al,ttInteger
	jae	@@4
	cmp	al,ttPointer
	jne	@@6
@@4:	cmp	es:[bx].tdType,ttInteger
	jae	@@5
	cmp	es:[bx].tdType,ttPointer
	jne	@@6
@@5:	mov	al,es:[bx].tdModifier
	push	ax
	Invoke	GetVarValue
	pop	ax
	Chain	ConvertOrdinal
@@6:	mov	ax,61
	Chain	CompileError
@@7:	mov	[di].exCode,0
	mov	[di].exRegsUsed,0
	mov	ax,emNotVirtual+pfMethod*256
	mov	dx,150
_GetMethod	label	near
	cmp	CurrentToken,t_Ident
	jne	@@8
	push	ax dx di
	mov	si,bx
	Invoke	SearchField
	mov	cl,al
	mov	si,di
	pop	di dx ax
	jnz	@@8
	cmp	cl,t_Proc
	jne	@@8
	test	es:[si].psFlags,ah
	jz	@@8
	jmp	_ProcessProc
@@8:	mov	ax,dx
	Chain	CompileError
ProcessType	endp

ProcessSet	proc	near
	Loc	BaseType,dword,1
	Loc	Temp1,byte,<size TExpr>
	Loc	Temp2,byte,<size TExpr>
	Loc	Value,byte,32
	Loc	Buffer,word,64
	Entry
	Invoke	GetToken
	push	di
	xor	ax,ax
	mov	BaseType.Offs,ax
	mov	BaseType.Segm,ax
	mov	Buffer[0],ax
	lea	di,Value
	push	ds
	pop	es
	mov	cx,16
	rep	stosw
	mov	al,tCBracket
	Invoke	CheckToken
	jnz	@@1
	mov	ax,SystemUnit
	mov	BaseType.Offs,_EmptySet
	mov	BaseType.Segm,ax
	jmp	@@10
@@1:	lea	di,Temp1
	call	GetComponent
	mov	al,tRange
	Invoke	CheckToken
	jnz	@@3
	lea	di,Temp2
	call	GetComponent
	cmp	Temp1.exLocation,elImmediate
	jne	@@2
	cmp	Temp2.exLocation,elImmediate
	jne	@@2
	mov	ax,Temp1.exValue.W0
	mov	dx,Temp2.exValue.W0
	jmp	short @@4
@@2:	lea	di,Temp1
	Invoke	UseExpr
	Invoke	PutPush
	lea	di,Temp2
	Invoke	UseExpr
	Invoke	PutPush
	mov	ax,_ZAddRange
	jmp	short @@7
@@3:	cmp	Temp1.exLocation,elImmediate
	jne	@@6
	mov	ax,Temp1.exValue.W0
	mov	dx,ax
@@4:	sub	dx,ax
	jc	@@8
	mov	si,ax
	mov	cl,3
	shr	si,cl
	mov	cl,al
	and	cl,7
	mov	al,1
	shl	al,cl
@@5:	or	Value[si],al
	rol	al,1
	adc	si,0
	dec	dx
	jns	@@5
	jmp	short @@8
@@6:	lea	di,Temp1
	Invoke	UseExpr
	Invoke	PutPush
	mov	ax,_ZAddComp
@@7:	Invoke	PutSystemCall
	Invoke	DoneGoal
	lea	bx,Buffer
	Invoke	AddGoal
@@8:	mov	al,tComma
	Invoke	CheckToken
	jnz	@@9
	jmp	@@1
@@9:	mov	al,tCBracket
	Invoke	NeedToken
@@10:	mov	ax,32
	mov	cx,ax
	Invoke	AllocTempBuf
	lea	si,Value
	mov	di,bx
	push	ds
	pop	es
	rep	movsb
	pop	di
	les	si,BaseType
	mov	[di].exType.Offs,si
	mov	[di].exType.Segm,es
	mov	[di].exCode,0
	mov	[di].exLocation,elImmediate
	mov	[di].exRegsUsed,0
	mov	[di].exOffset,bx
	cmp	Buffer[0],0
	je	@@11
	Invoke	LoadSet
	Invoke	UseExpr
	lea	bx,Buffer
	Invoke	FlushGoals
	Invoke	DoneExpr
@@11:	Exit

GetComponent	proc	near
	Invoke	GetOrdExpr
	Invoke	GetVarValue
	cmp	BaseType.Offs,0
	jne	@@1
	les	bx,[di].exType
	mov	ax,es:[bx].itBase.Offs
	mov	bx,es:[bx].itBase.Segm
	mov	bx,es:[bx]
	add	ax,etSet
	mov	BaseType.Offs,ax
	mov	BaseType.Segm,bx
@@1:	les	bx,[di].exType
	mov	ax,es:[bx].itBase.Offs
	mov	bx,es:[bx].itBase.Segm
	mov	bx,es:[bx]
	add	ax,etSet
	cmp	ax,BaseType.Offs
	jne	@@2
	cmp	bx,BaseType.Segm
	jne	@@2
	Chain	CastByte
@@2:	mov	ax,26
	Chain	CompileError
GetComponent	endp

ProcessSet	endp

ProcessAt	proc	near
	Invoke	GetToken
	call	GetRef
	xor	cx,cx
	call	GetAddress
	Chain	CastPointer
ProcessAt	endp

GetAddress	proc	near
	les	si,[di].exType
	cmp	[di].exLocation,elCall
	je	@@2
	cmp	es:[si].tdType,ttProc
	je	@@1
	mov	[di].exLocation,elAddress
	mov	[di].exModifier,emLongint
	and	[di].exMisc,not efReadOnly
	test	CompilerFlags.B0,cfDebugging
	jz	@@1
	mov	[di].exLocation,elImmediate
@@1:	ret
@@2:	test	CompilerFlags.B0,cfDebugging
	jnz	@@6
	mov	al,es:[si-psType].psFlags
	test	al,pfInline
	jnz	@@5
	test	al,pfMethod
	jz	@@3
	test	[di].exModifier,emNotVirtual
	jz	@@5
@@3:	or	ch,ch
	jz	@@4
	test	al,pfInterrupt+pfMethod
	jnz	@@5
	test	al,pfFar
	jz	@@5
	cmp	es:[si-psType].psScope,0
	jne	@@5
@@4:	xor	ax,ax
	mov	bx,es:[si-psType].psProcMap
	mov	[di].exLocation,elAddress
	mov	[di].exModifier,emLongint
	mov	[di].exRegsUsed,al
	mov	[di].exMisc,efConst
	mov	[di].exOffset,ax
	mov	[di].exMap,bx
	mov	[di].exSegment,es
	ret
@@5:	mov	ax,143
	Chain	CompileError
@@6:	call	CheckProgLoaded
	test	[di].exModifier,emNotVirtual
	jnz	@@7
	mov	bx,es:[si-psType].psOwner
	or	bx,bx
	jz	@@7
	mov	si,es:[si-psType].psScope
	mov	ax,es:[si].otVMTOffset
	les	si,dword ptr [di].exValue
	add	si,ax
	mov	si,es:[si]
	mov	ax,ProgramSegment
	add	ax,DataStart
	mov	es,ax
	mov	ax,es:[bx+si].Offs
	mov	dx,es:[bx+si].Segm
	jmp	short @@8
@@7:	test	es:[si-psType].psFlags,pfInline
	jnz	@@9
	mov	si,es:[si-psType].psProcMap
	add	si,es:uhProcMap
	mov	ax,es:[si].pmEntryPoint
	mov	si,es:[si].pmCodeMap
	add	si,es:uhCodeMap
	mov	dx,es:[si].smAddr
	cmp	dx,-1
	je	@@9
	add	ax,dx
	mov	dx,ProgramSegment
	add	dx,es:uhCodeStart
@@8:	mov	[di].exLocation,elImmediate
	mov	[di].exModifier,emLongint
	mov	[di].exValue.Offs,ax
	mov	[di].exValue.Segm,dx
	ret
@@9:	mov	ax,139
	Chain	CompileError
GetAddress	endp

ProcessMem	proc	near
	Loc	Temp1,byte,<size TExpr>
	Loc	Temp2,byte,<size TExpr>
	Entry
	Invoke	GetToken
	les	si,CurrentSymbol
	mov	bx,es:[si].Offs
	mov	si,es:[si].Segm
	mov	es,es:[si]
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	mov	al,es:[bx].tdModifier
	mov	[di].exModifier,al
	push	di
	mov	al,tOBracket
	Invoke	NeedToken
	lea	di,Temp1
	Invoke	GetIntExpr
	Invoke	GetVarValue
	Invoke	CastWord
	mov	al,tColon
	Invoke	NeedToken
	lea	di,Temp2
	Invoke	GetIntExpr
	Invoke	GetVarValue
	Invoke	CastWord
	mov	al,tCBracket
	Invoke	NeedToken
	test	CompilerFlags.B0,cfDebugging
	jnz	@@1
	lea	di,Temp1
	Invoke	UseExpr
	mov	al,lvAX
	Invoke	LoadValue
	mov	al,50h			; push	ax
	Invoke	PutByte
	lea	di,Temp2
	Invoke	UseExpr
	mov	al,lvDI
	Invoke	LoadValue
	mov	al,7			; pop	es
	Invoke	PutByte
	pop	di
	Invoke	DoneExpr
	mov	al,Temp1.exRegsUsed
	or	al,Temp2.exRegsUsed
	and	al,erAll
	mov	[di].exRegsUsed,al
	mov	[di].exMisc,efES+efDI
	xor	ax,ax
	mov	[di].exOffset,ax
	mov	[di].exMap,ax
	mov	[di].exSegment,ax
	jmp	short @@2
@@1:	pop	di
	xor	ax,ax
	mov	[di].exCode,ax
	mov	[di].exMisc,al
	mov	ax,Temp2.exValue.W0
	mov	[di].exValue.Offs,ax
	mov	ax,Temp1.exValue.W0
	mov	[di].exValue.Segm,ax
@@2:	mov	[di].exLocation,elMemory
	Exit
ProcessMem	endp

ProcessPort	proc	near
	Loc	Opcode,byte,2
	Entry
	call	CheckDebugging
	Invoke	GetToken
	les	si,CurrentSymbol
	mov	al,0e4h			; in	al,...
	add	al,es:[si]
	mov	Opcode,al
	mov	al,tOBracket
	Invoke	NeedToken
	Invoke	GetIntExpr
	Invoke	CastWord
	mov	al,tCBracket
	Invoke	NeedToken
	cmp	[di].exLocation,elImmediate
	jne	@@1
	mov	ax,[di].exValue.W0
	or	ah,ah
	jnz	@@1
	mov	ah,al
	mov	al,Opcode
	Invoke	PutWord
	jmp	short @@2
@@1:	Invoke	UseExpr
	mov	al,lvDX
	Invoke	LoadValue
	mov	al,Opcode
	or	al,8
	Invoke	PutByte
@@2:	Invoke	DoneExpr
	mov	[di].exModifier,emByte
	test	Opcode,1
	jz	@@3
	mov	[di].exModifier,emWord
@@3:	mov	[di].exLocation,elRegister
	or	[di].exRegsUsed,erAX
	mov	[di].exMisc,0
	Exit
ProcessPort	endp

ProcessReg	proc	near
	Invoke	GetToken
	les	si,CurrentSymbol
	mov	dl,es:[si]
	mov	bx,_Byte
	or	dl,dl
	js	@@1
	mov	bx,_Word
@@1:	mov	es,SystemUnit
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	xor	ax,ax
	mov	[di].exCode,ax
	mov	[di].exLocation,elMemory
	mov	cl,es:[bx].tdModifier
	mov	[di].exModifier,cl
	mov	[di].exRegsUsed,al
	mov	[di].exMisc,al
	and	dx,7fh
	add	dx,offset Rg
	mov	[di].exValue.Offs,dx
	mov	[di].exValue.Segm,ds
	ret
ProcessReg	endp

CheckDebugging	proc	near
	test	CompilerFlags.B0,cfDebugging
	jnz	@@1
	ret
@@1:	mov	ax,133
	Chain	CompileError
CheckDebugging	endp

CheckProgLoaded	proc	near
	cmp	ProgramSegment,0
	je	@@1
	ret
@@1:	mov	ax,139
	Chain	CompileError
CheckProgLoaded	endp

GetReference	proc	near
	call	LValue
@@1:	cmp	[di].exLocation,elCall
	jne	@@2
	test	CompilerFlags.B0,cfDebugging
	jnz	@@4
	les	bx,[di].exType
	cmp	es:[bx].ptResult.Offs,0
	je	@@3
	Invoke	PutCall
	Invoke	ReturnValue
@@2:	call	Qualifier
	jz	@@1
	cmp	[di].exLocation,elMemory
	jne	@@4
	test	[di].exMisc,efReadOnly
	jnz	@@4
	ret
@@3:	mov	ax,143
	Chain	CompileError
@@4:	mov	ax,122
	Chain	CompileError
GetReference	endp

GetRef	proc	near
	call	LValue
@@1:	les	bx,[di].exType
	cmp	es:[bx].tdType,ttProc
	je	@@2
	call	Qualifier
	jz	@@1
	cmp	[di].exLocation,elMemory
	jne	@@3
	test	[di].exMisc,efReadOnly
	jnz	@@3
@@2:	ret
@@3:	mov	ax,122
	Chain	CompileError
GetRef	endp

GetLvalue	proc	near
	cmp	CurrentToken,t_Proc
	jne	LValue
	Invoke	GetReturnVar
	jc	LValue
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	mov	[di].exOffset,ax
	mov	al,es:[bx].tdModifier
	mov	[di].exModifier,al
	mov	[di].exLocation,elMemory
	mov	[di].exRegsUsed,0
	mov	dx,CurrentHash
	call	GetLocalRef
	cmp	[di].exOffset,0
	jl	@@1
	mov	dx,38c4h		; les	di,
	Invoke	AddReg
	mov	[di].exMisc,efES+efDI
	mov	[di].exOffset,0
@@1:	Invoke	DoneExpr
	Chain	GetToken
GetLvalue	endp

LValue	proc	near
	Invoke	GetSymbol
	lea	bx,@@2
	Invoke	ChooseToken
	jnz	@@1
	jmp	word ptr cs:[bx+1]
@@1:	mov	ax,20
	Chain	CompileError
@@2	db	8,3
	db	t_Var
	dw	ProcessVar
	db	t_Proc
	dw	ProcessProc
	db	t_Type
	dw	ProcessType
	db	tString
	dw	ProcessType
	db	tFile
	dw	ProcessType
	db	t_StdFun
	dw	ProcessStdFun
	db	t_Mem
	dw	ProcessMem
	db	tAt
	dw	ProcessAt
LValue	endp

Qualifier	proc	near
	mov	al,CurrentToken
	lea	bx,ProcessIndex
	cmp	al,tOBracket
	je	@@1
	lea	bx,ProcessField
	cmp	al,tPoint
	je	@@1
	lea	bx,ProcessPointer
	cmp	al,tCaret
	je	@@1
	ret
@@1:	call	bx
	xor	ax,ax
	ret
Qualifier	endp

ProcessIndex	proc	near
	Loc	Temp,byte,<size TExpr>
	Loc	LowerBound,word,1
	Loc	ElementSize,word,1
	Loc	BaseType,dword,1
	Entry
@@1:	les	bx,[di].exType
	mov	al,es:[bx].tdType
	cmp	al,ttArray
	je	@@3
	cmp	al,ttString
	je	@@3
@@2:	mov	ax,121
	Chain	CompileError
@@3:	cmp	[di].exLocation,elMemory
	jne	@@2
	test	[di].exMisc,efReadOnly
	jnz	@@2
	mov	ax,es:[bx].atBounds.Offs
	mov	bx,es:[bx].atBounds.Segm
	mov	es,es:[bx]
	mov	bx,ax
	Invoke	GetToken
	mov	ax,es:[bx].itLowerBound.W0
	mov	LowerBound,ax
	mov	BaseType.Offs,bx
	mov	BaseType.Segm,es
	push	di
	lea	di,Temp
	call	GetExpr
	Invoke	LoadAddress
	Invoke	GetVarValue
	lea	si,BaseType
	Invoke	TypeCompat
	mov	IndexModifier,emX
	Invoke	CastOrdinal
	mov	IndexModifier,0
	mov	si,di
	pop	di
	les	bx,[di].exType
	mov	ax,es:[bx].atBase.Offs
	mov	bx,es:[bx].atBase.Segm
	mov	es,es:[bx]
	mov	bx,ax
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	mov	al,es:[bx].tdModifier
	mov	[di].exModifier,al
	mov	ax,es:[bx].tdSizeOf
	mov	ElementSize,ax
	cmp	[si].exLocation,elImmediate
	jne	@@4
	mov	ax,[si].exValue.W0
	sub	ax,LowerBound
	mul	ElementSize
	add	[di].exOffset,ax
	jmp	short @@7
@@4:	mov	ax,LowerBound
	mul	ElementSize
	sub	[di].exOffset,ax
	xchg	si,di
	Invoke	UseExpr
	mov	cx,ElementSize
	test	[si].exMisc,efDI
	jnz	@@5
	mov	al,lvDI
	Invoke	Scale
	mov	al,lvDI
	Invoke	LoadValue
	xchg	si,di
	Invoke	UseExpr
	jmp	short @@6
@@5:	mov	al,lvAX
	Invoke	Scale
	mov	al,[si].exRegsUsed
	Invoke	FindEmptyReg
	xchg	si,di
	Invoke	UseExpr
	xchg	si,di
	mov	al,lvAX
	Invoke	PopValue
	mov	ax,0f803h		; add	di,
	or	ah,[di].exMisc
	Invoke	PutWord
	xchg	si,di
@@6:	Invoke	DoneExpr
	mov	al,[si].exRegsUsed
	and	al,erAll
	or	[di].exRegsUsed,al
	or	[di].exMisc,efDI
@@7:	cmp	CurrentToken,tComma
	jne	@@8
	jmp	@@1
@@8:	mov	al,tCBracket
	Invoke	NeedToken
	Exit
ProcessIndex	endp

ProcessField	proc	near
	les	bx,[di].exType
	cmp	es:[bx].tdType,ttRecord
	je	@@1
	cmp	es:[bx].tdType,ttObject
	jne	@@3
@@1:	Invoke	GetToken
	cmp	CurrentToken,t_Ident
	jne	@@4
	push	di
	mov	si,bx
	Invoke	SearchField
	mov	si,di
	pop	di
	jnz	@@4
	cmp	al,t_Var
	jne	@@2
	mov	ax,es:[si].vsOffset
	add	[di].exOffset,ax
	mov	bx,es:[si].vsType.Offs
	mov	si,es:[si].vsType.Segm
	mov	es,es:[si]
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	mov	al,es:[bx].tdModifier
	mov	[di].exModifier,al
	Chain	GetToken
@@2:	mov	al,0
	jmp	_ProcessProc
@@3:	mov	ax,121
	Chain	CompileError
@@4:	mov	ax,44
	Chain	CompileError
ProcessField	endp

ProcessPointer	proc	near
	les	bx,[di].exType
	cmp	es:[bx].tdType,ttPointer
	je	@@1
	mov	ax,121
	Chain	CompileError
@@1:	Invoke	GetToken
	mov	si,es:[bx].ptBase.Segm
	mov	bx,es:[bx].ptBase.Offs
	mov	es,es:[si]
	mov	[di].exType.Offs,bx
	mov	[di].exType.Segm,es
	mov	al,es:[bx].tdModifier
	mov	[di].exModifier,al
LoadPtr	label	near
	test	CompilerFlags.B0,cfDebugging
	jnz	@@6
	cmp	[di].exLocation,elAddress
	je	@@5
	cmp	[di].exLocation,elImmediate
	jne	@@2
	mov	[di].exMisc,0
	jmp	short @@5
@@2:	Invoke	UseExpr
	cmp	[di].exLocation,elMemory
	jne	@@3
	mov	dx,38c4h		; les	di,
	Invoke	AddReg
	jmp	short @@4
@@3:	mov	ax,0c789h		; mov	di,ax
	Invoke	PutWord
	mov	ax,0c28eh		; mov	es,dx
	Invoke	PutWord
@@4:	Invoke	DoneExpr
	mov	[di].exMisc,efES+efDI
	mov	[di].exOffset,0
@@5:	mov	[di].exLocation,elMemory
	ret
@@6:	cmp	[di].exLocation,elImmediate
	je	@@7
	les	bx,dword ptr [di].exValue
	les	bx,es:[bx]
	mov	[di].exValue.Offs,bx
	mov	[di].exValue.Segm,es
@@7:	mov	[di].exLocation,elMemory
	mov	[di].exMisc,0
	ret
ProcessPointer	endp

	end

⌨️ 快捷键说明

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