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

📄 stmt.asm

📁 Turbo Pascal 6.0编译器源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	Invoke	NeedToken
@@2:	call	Case
	Invoke	DoneGoal
	lea	bx,Buffer
	Invoke	AddGoal
	call	Statement
	lea	bx,Buffer
	Invoke	AddGoal
	mov	al,tSemicolon
	Invoke	CheckToken
	jnz	@@3
	cmp	CurrentToken,tEnd
	je	@@3
	cmp	CurrentToken,tElse
	je	@@3
	mov	al,cdAlways
	lea	bx,EndLabel
	Invoke	PutJmp
	lea	bx,NextLabel
	Invoke	PutLabel
	jmp	@@2
@@3:	mov	al,tElse
	Invoke	CheckToken
	jnz	@@5
	mov	al,cdAlways
	lea	bx,EndLabel
	Invoke	PutJmp
	lea	bx,NextLabel
	Invoke	PutLabel
	Invoke	DoneGoal
	lea	bx,Buffer
	Invoke	AddGoal
@@4:	call	Statement
	lea	bx,Buffer
	Invoke	AddGoal
	cmp	CurrentToken,tEnd
	je	@@5
	mov	al,tSemicolon
	Invoke	NeedToken
	jmp	@@4
@@5:	mov	al,tEnd
	Invoke	NeedToken
	lea	bx,Buffer
	Invoke	FlushGoals
	lea	bx,EndLabel
	mov	ax,NextLabel
	Invoke	AddToChain
	lea	bx,EndLabel
	Invoke	PutLabel
	Invoke	DoneGoal
	Exit

Case	proc	near
	Invoke	GetLineNumber
	Invoke	PutLineNumber
@@1:	call	CaseConstant
	mov	dl,cdEqual
	mov	al,tRange
	Invoke	CheckToken
	jnz	@@3
	mov	al,cdLess
	mov	dl,cdNotGreater
	test	CaseExpr.exModifier,emUnsigned
	jz	@@2
	mov	al,cdBelow
	mov	dl,cdNotAfter
@@2:	push	dx
	lea	bx,NextLabel
	Invoke	PutJmp
	call	CaseConstant
	pop	dx
@@3:	mov	al,tComma
	Invoke	CheckToken
	jnz	@@4
	mov	al,dl
	lea	bx,CaseLabel
	Invoke	PutJmp
	lea	bx,NextLabel
	Invoke	PutLabel
	jmp	@@1
@@4:	mov	al,dl
	xor	al,1
	lea	bx,NextLabel
	Invoke	PutJmp
	lea	bx,CaseLabel
	Invoke	PutLabel
	mov	al,tColon
	Chain	NeedToken
Case	endp

CaseConstant	proc	near
	lea	di,CaseConst
	Invoke	GetConstExpr
	cmp	bx,BaseType.Offs
	jnz	@@2
	mov	ax,es
	cmp	ax,BaseType.Segm
	jnz	@@2
	mov	al,CaseExpr.exModifier
	mov	ah,[di].exModifier
	Invoke	IntExtension
	cmp	al,CaseExpr.exModifier
	jne	@@3
	test	al,emX
	jz	@@1
	mov	al,3dh			; cmp	ax,
	Invoke	PutByte
	mov	ax,[di].exValue.W0
	Chain	PutWord
@@1:	mov	al,3ch			; cmp	al,
	mov	ah,[di].exValue.B0
	Chain	PutWord
@@2:	mov	ax,74
	Chain	CompileError
@@3:	mov	ax,112
	Chain	CompileError
CaseConstant	endp

CaseStatement	endp

WithStatement	proc	near
	Loc	SaveWithChain,word,1
	Loc	WithVar,byte,<size TExpr>
	Loc	Buffer,word,32
	Entry
	Invoke	GetToken
	mov	ax,WithChain
	mov	SaveWithChain,ax
	mov	Buffer[0],0
@@1:	lea	di,WithVar
	Invoke	GetReference
	les	bx,[di].exType
	cmp	es:[bx].tdType,ttRecord
	je	@@2
	cmp	es:[bx].tdType,ttObject
	je	@@2
	mov	ax,75
	Chain	CompileError
@@2:	sub	sp,size TWithChain
	mov	si,sp
	mov	ax,WithChain
	mov	[si].wcNext,ax
	mov	WithChain,si
	mov	[si].wcOwner.Offs,bx
	mov	[si].wcOwner.Segm,es
	mov	al,[di].exMisc
	test	al,efDS+efSS
	jz	@@3
	test	al,efDI
	jnz	@@3
	mov	[si].wcType,wfNoTempVar
	mov	[si].wcFlags,al
	mov	ax,[di].exOffset
	mov	[si].wcOffset,ax
	mov	ax,[di].exMap
	mov	[si].wcMap,ax
	mov	ax,[di].exSegment
	mov	[si].wcSegment,ax
	jmp	short @@4
@@3:	mov	ax,4
	Invoke	AllocStack
	mov	[si].wcType,wfTempVar
	mov	[si].wcFlags,efSS+efBP
	mov	[si].wcOffset,ax
	xor	ax,ax
	mov	[si].wcMap,ax
	mov	[si].wcSegment,ax
	Invoke	UseExpr
	Invoke	LoadSegDI
	push	ax
	mov	dx,3e89h		; mov	[bp-...],di
	mov	ax,[si].wcOffset
	Invoke	AddOffset
	pop	ax
	mov	dx,68ch			; mov	[bp-...],es
	or	dh,al
	mov	ax,[si].wcOffset
	add	ax,2
	Invoke	AddOffset
	Invoke	DoneGoal
	lea	bx,Buffer
	Invoke	AddGoal
@@4:	mov	al,tComma
	Invoke	CheckToken
	jnz	@@5
	jmp	@@1
@@5:	mov	al,tDo
	Invoke	NeedToken
	call	Statement
	lea	bx,Buffer
	Invoke	AddGoal
	mov	ax,SaveWithChain
	mov	WithChain,ax
	lea	bx,Buffer
	Invoke	FlushGoals
	Invoke	DoneGoal
	Exit
WithStatement	endp

GotoStatement	proc	near
	Invoke	GetToken
	Invoke	Number2Ident
	Invoke	GetSymbol
	mov	al,t_Label
	Invoke	NeedToken
	Invoke	GetHash
	mov	dx,CurrentHash
	cmp	dx,si
	jb	@@1
	mov	ax,8
	Invoke	GetStmtMem
	push	di
	mov	ax,0eb08h
	stosw
	mov	ax,dx
	stosw
	pop	ax
	xchg	ax,LabelChain
	stosw
	Chain	DoneGoal
@@1:	mov	ax,80
	Chain	CompileError
GotoStatement	endp

InlineStatement	proc	near
	Invoke	GetToken
	push	Dictionary.Offs
	call	ProcessInline
	call	PutInline
	pop	Dictionary.Offs
	Chain	DoneGoal
InlineStatement	endp

ProcessInline	proc	near
	Loc	Temp,byte,<size TInlineRecord>
	Entry
	push	Dictionary.Offs
	mov	SlashToken,tInlineSlash
	mov	al,tOParen
	Invoke	NeedToken
@@1:	mov	al,tGreater
	Invoke	CheckToken
	mov	al,itWord
	jz	@@2
	mov	al,tLess
	Invoke	CheckToken
	mov	al,itByte
	jz	@@2
	mov	al,-1
@@2:	mov	Temp.irType,al
	Invoke	GetSymbol
	cmp	CurrentToken,t_Var
	jne	@@7
	les	di,CurrentSymbol
@@3:	test	es:[di].vsFlags,vfAlias
	jz	@@4
	mov	bx,es:[di].vsLink.Segm
	mov	di,es:[di].vsLink.Offs
	mov	es,es:[bx]
	jmp	@@3
@@4:	mov	al,es:[di].vsFlags
	test	al,vfLocal
	jnz	@@5
	cmp	Temp.irType,0
	je	@@6
	and	al,vfConst+vfLocal
	add	al,itDataFixup
	mov	Temp.irType,al
	mov	ax,es:[di].vsScope
	mov	Temp.irFixup.Offs,ax
	mov	dx,es
	Invoke	SearchUnit
	mov	Temp.irFixup.Segm,dx
@@5:	mov	ax,es:[di].vsOffset
	jmp	short @@8
@@6:	mov	ax,105
	Chain	CompileError
@@7:	cmp	CurrentToken,t_Proc
	jne	@@11
	Invoke	GetReturnVar
	jc	@@11
@@8:	mov	Temp.irValue,ax
	cmp	Temp.irType,0
	jge	@@9
	mov	Temp.irType,itWord
@@9:	Invoke	GetToken
	Invoke	GetPlusMinus
	or	al,al
	jz	@@12
	push	ax
	Invoke	GetIntConstExpr
	pop	cx
	cmp	cl,tMinus
	jne	@@10
	neg	ax
@@10:	add	Temp.irValue,ax
	jmp	short @@12
@@11:	Invoke	GetIntConstExpr
	mov	Temp.irValue,ax
@@12:	mov	al,Temp.irType
	cmp	al,-1
	jne	@@14
	mov	al,itByte
	cmp	Temp.irValue.B1,0
	je	@@13
	mov	al,itWord
@@13:	mov	Temp.irType,al
@@14:	mov	cl,al
	add	cl,2
	cmp	al,itDataFixup
	jb	@@15
	mov	cl,7
@@15:	xor	ch,ch
	mov	ax,cx
	Invoke	GetDictMem
	lea	si,Temp
	rep	movsb
	mov	al,tInlineSlash
	Invoke	CheckToken
	jnz	@@16
	jmp	@@1
@@16:	mov	SlashToken,tSlash
	mov	al,tCParen
	Invoke	NeedToken
	pop	di
	les	cx,Dictionary
	sub	cx,di
	Exit
ProcessInline	endp

PutInline	proc	near
	add	cx,di
	jmp	short @@6
@@1:	push	cx
	mov	al,es:[di].irType
	cmp	al,itByte
	je	@@4
	cmp	al,itWord
	je	@@3
	mov	cx,ffData+ffOffs
	cmp	al,itDataFixup
	je	@@2
	mov	cx,ffConst+ffOffs
@@2:	mov	bx,es:[di].irFixup.Segm
	mov	ax,es:[bx]
	mov	bx,es:[di].irFixup.Offs
	mov	dx,es:[di].irValue
	Invoke	PutFixup
	add	di,7
	jmp	short @@5
@@3:	mov	ax,es:[di].irValue
	Invoke	PutWord
	add	di,3
	jmp	short @@5
@@4:	mov	al,es:[di].irValue.B0
	Invoke	PutByte
	inc	di
	inc	di
@@5:	pop	cx
@@6:	cmp	di,cx
	jne	@@1
	ret
PutInline	endp

PortAssignment	proc	near
	Loc	Opcode,byte,2
	Loc	PortNum,byte,<size TExpr>
	Loc	Value,byte,<size TExpr>
	Entry
	Invoke	GetToken
	les	si,CurrentSymbol
	mov	al,0e6h			; out	...,al
	add	al,es:[si]
	mov	Opcode,al
	mov	al,tOBracket
	Invoke	NeedToken
	lea	di,PortNum
	Invoke	GetIntExpr
	Invoke	CastWord
	mov	al,tCBracket
	Invoke	NeedToken
	mov	al,tAssign
	Invoke	NeedToken
	lea	di,Value
	Invoke	GetIntExpr
	test	Opcode,1
	jz	@@1
	Invoke	CastWord
	jmp	short @@2
@@1:	Invoke	CastByte
@@2:	lea	si,PortNum
	cmp	[si].exLocation,elImmediate
	jne	@@3
	cmp	[si].exValue.B1,0
	jne	@@3
	Invoke	UseExpr
	mov	al,lvAX
	Invoke	LoadValue
	mov	al,Opcode
	mov	ah,[si].exValue.B0
	Invoke	PutWord
	jmp	short @@4
@@3:	Invoke	MakePtr
	mov	al,Opcode
	or	al,8
	Invoke	PutByte
@@4:	Invoke	DoneGoal
	Exit
PortAssignment	endp

Assignment	proc	near
	Loc	Left,byte,<size TExpr>
	Loc	Right,byte,<size TExpr>
	Entry
	lea	di,Left
	Invoke	GetLvalue
@@1:	les	bx,[di].exType
	cmp	es:[bx].tdType,ttProc
	jne	@@3
	cmp	[di].exLocation,elCall
	je	@@2
	cmp	CurrentToken,tAssign
	je	@@4
@@2:	Invoke	PutCall
	les	bx,[di].exType
	cmp	es:[bx].ptResult.Offs,0
	je	@@5
	Invoke	ReturnValue
	Invoke	Qualifier
	jz	@@1
	test	GlobalOptions,coExtSyntax
	jz	@@4
	cmp	CurrentToken,tAssign
	je	@@4
	Invoke	DiscardReturn
	jmp	short @@5
@@3:	Invoke	Qualifier
	jz	@@1
@@4:	cmp	[di].exLocation,elMemory
	jne	@@6
	test	[di].exMisc,efReadOnly
	jnz	@@6
	les	bx,[di].exType
	mov	al,es:[bx].tdType
	cmp	al,ttVoid
	je	@@7
	cmp	al,ttFile
	je	@@7
	cmp	al,ttText
	je	@@7
	mov	al,tAssign
	Invoke	NeedToken
	lea	di,Right
	lea	si,Left
	Invoke	GetExpression
	lea	si,Left
	Invoke	AssignmentCast
	Invoke	TypeCompat
	Invoke	CastOrdinal
	xchg	si,di
	Invoke	Store
@@5:	mov	ax,[di].exCode
	Exit
@@6:	mov	ax,122
	Chain	CompileError
@@7:	mov	ax,43
	Chain	CompileError
Assignment	endp

	end

⌨️ 快捷键说明

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