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

📄 convert2.asm

📁 Turbo Pascal 6.0编译器源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	mov	[di].exLocation,elStack
	mov	[di].exModifier,emExtended
	ret
@@3:	mov	ax,256
	Invoke	CreateLocalVar
	Invoke	UseExpr
	Chain	DoneExpr
ReturnValue	endp

DiscardReturn	proc	near
	les	bx,[di].exType
	cmp	es:[bx].tdType,ttString
	je	@@1
	cmp	es:[bx].tdType,tt8087
	je	@@2
	ret
@@1:	Invoke	UseExpr
	mov	ax,0c483h		; add	sp,4
	Invoke	PutWord
	mov	al,4
	Invoke	PutByte
	Chain	DoneExpr
@@2:	Invoke	UseExpr
	Invoke	PutEmulInt
	mov	ax,0d835h		; fstp	st(0)
	Invoke	PutWord
	Chain	DoneExpr
DiscardReturn	endp

GetActualParams	proc	near
	Loc	ParamType,dword,1
	Loc	Param,byte,<size TExpr>
	Loc	Buffer,word,64
	Entry
	les	si,[di].exType
	mov	cx,es:[si].ptParamCount
	add	si,ptParams
	jcxz	@@3
	mov	Buffer[0],0
	mov	al,tOParen
	Invoke	NeedToken
	push	di
@@1:	push	cx si es
	call	GetActualParam
	pop	es si cx
	add	si,size TProcParam
	dec	cx
	jz	@@2
	mov	al,tComma
	Invoke	NeedToken
	jmp	@@1
@@2:	pop	di
	mov	al,tCParen
	Invoke	NeedToken
	lea	bx,Buffer
	Invoke	FlushGoals
@@3:	Exit

GetActualParam	proc	near
	mov	al,es:[si].ppFlags
	mov	bx,es:[si].ppType.Segm
	mov	si,es:[si].ppType.Offs
	mov	es,es:[bx]
	mov	ParamType.offs,si
	mov	ParamType.segm,es
	lea	di,Param
	test	al,vfAddress
	jnz	@@6
	lea	si,ParamType
	Invoke	GetExpression
	lea	si,ParamType
	Invoke	AssignmentCast
	call	TypeCompat
	call	CastOrdinal
	les	bx,[di].exType
	mov	al,es:[bx].tdType
	cmp	al,ttInteger
	jae	@@1
	cmp	al,ttPointer
	je	@@1
	cmp	al,ttProc
	je	@@1
	cmp	al,ttSet
	je	@@2
	cmp	al,ttString
	je	@@3
	cmp	al,tt8087
	je	@@4
	cmp	al,ttReal
	je	@@5
	call	ShortRecord
	jnz	@@10
@@1:	Invoke	PushValue
	jmp	short @@11
@@2:	Invoke	_LoadSet
	call	NeedCopyParam
	jz	@@10
	Invoke	LoadSet
	jmp	short @@10
@@3:	Invoke	PutImmedString
	call	NeedCopyParam
	jz	@@10
	Invoke	_LoadString
	jmp	short @@10
@@4:	Invoke	PushFloat
	jmp	short @@11
@@5:	Invoke	PushReal
	jmp	short @@11
@@6:	Invoke	GetReference
	les	bx,ParamType
	mov	al,es:[bx].tdType
	cmp	al,ttVoid
	je	@@10
	cmp	al,ttString
	je	@@7
	cmp	al,ttObject
	jne	@@9
	mov	ax,bx
	mov	dx,es
	les	bx,[di].exType
	Invoke	CheckInherit
	jz	@@10
	jmp	short @@8
@@7:	test	CompilerOptions,coVarStringChk
	jnz	@@9
	les	bx,[di].exType
	cmp	es:[bx].tdType,ttString
	je	@@10
@@8:	mov	ax,26
	Chain	CompileError
@@9:	cmp	bx,[di].exType.Offs
	jne	@@8
	mov	ax,es
	cmp	ax,[di].exType.Segm
	jnz	@@8
@@10:	Invoke	PushAddr
@@11:	mov	ax,[di].exCode
	lea	bx,Buffer
	Chain	AddGoal
GetActualParam	endp

GetActualParams	endp

NeedCopyParam	proc	near
	test	CompilerOptions,coOverlayCode
	jz	@@1
	cmp	[di].exLocation,elStack
	je	@@1
	test	[di].exMisc,efCS
@@1:	ret
NeedCopyParam	endp

TypeCompat	proc	near
	les	bx,[di].exType
	mov	al,es:[bx].tdType
	les	bx,[si].exType
	cmp	al,es:[bx].tdType
	jne	@@1
	mov	bl,al
	xor	bh,bh
	shl	bx,1
	call	cs:@@2[bx]
	jnz	@@1
	ret
@@1:	mov	ax,26
	Chain	CompileError
@@2	dw	StrictCompat
	dw	StrictCompat
	dw	StrictCompat
	dw	StrictCompat
	dw	StrictCompat
	dw	StrictCompat
	dw	ProcCompat
	dw	SetCompat
	dw	PointerCompat
	dw	AnyCompat
	dw	AnyCompat
	dw	AnyCompat
	dw	AnyCompat
	dw	AnyCompat
	dw	AnyCompat
	dw	EnumCompat
TypeCompat	endp

AnyCompat	proc	near
	xor	ax,ax
	ret
AnyCompat	endp

StrictCompat	proc	near
	mov	ax,[di].exType.Offs
	cmp	ax,[si].exType.Offs
	jne	@@1
	mov	ax,[di].exType.Segm
	cmp	ax,[si].exType.Segm
@@1:	ret
StrictCompat	endp

ProcCompat	proc	near
	push	si di ds
	les	di,[di].exType
	lds	si,[si].exType
	cmpsw
	jne	@@2
	cmpsw
	jne	@@2
	cmpsw
	call	ParamCompat
	jnz	@@2
	lodsw
	scasw
	jne	@@2
	xchg	ax,cx
	jcxz	@@2
@@1:	call	ParamCompat
	jnz	@@2
	cmpsb
	jne	@@2
	loop	@@1
@@2:	pop	ds di si
	ret
ProcCompat	endp

ParamCompat	proc	near
	cmpsw
	jne	@@1
	lodsw
	mov	bx,es:[di]
	inc	di
	inc	di
	or	ax,ax
	jz	@@1
	mov	bx,es:[bx]
	xchg	ax,bx
	cmp	ax,[bx]
@@1:	ret
ParamCompat	endp

SetCompat	proc	near
	les	bx,[di].exType
	cmp	es:[bx].stBase.Offs,0
	je	@@2
	mov	cx,es:[bx].stBase.Offs
	mov	bx,es:[bx].stBase.Segm
	mov	es,es:[bx]
	mov	bx,cx
	mov	ax,es:[bx].itBase.Offs
	mov	bx,es:[bx].itBase.Segm
	mov	dx,es:[bx]
	les	bx,[si].exType
	cmp	es:[bx].stBase.Offs,0
	je	@@1
	mov	cx,es:[bx].stBase.Offs
	mov	bx,es:[bx].stBase.Segm
	mov	es,es:[bx]
	mov	bx,cx
	cmp	ax,es:[bx].itBase.Offs
	jne	@@1
	mov	bx,es:[bx].itBase.Segm
	cmp	dx,es:[bx]
@@1:	ret
@@2:	mov	ax,[si].exType.Offs
	mov	[di].exType.Offs,ax
	mov	ax,[si].exType.Segm
	mov	[di].exType.Segm,ax
	ret
SetCompat	endp

PointerCompat	proc	near
	call	StrictCompat
	jz	@@1
	les	bx,[si].exType
	mov	ax,es:[bx].ptBase.Offs
	mov	bx,es:[bx].ptBase.Segm
	mov	es,es:[bx]
	mov	bx,ax
	cmp	es:[bx].tdSizeOf,0
	je	@@1
	mov	dx,es
	les	bx,[di].exType
	mov	cx,es:[bx].ptBase.Offs
	mov	bx,es:[bx].ptBase.Segm
	mov	es,es:[bx]
	mov	bx,cx
	cmp	es:[bx].tdSizeOf,0
	jne	@@1
	mov	ax,[si].exType.Offs
	mov	[di].exType.Offs,ax
	mov	ax,[si].exType.Segm
	mov	[di].exType.Segm,ax
@@1:	ret
PointerCompat	endp

EnumCompat	proc	near
	les	bx,[di].exType
	mov	ax,es:[bx].itBase.Offs
	mov	bx,es:[bx].itBase.Segm
	mov	dx,es:[bx]
	les	bx,[si].exType
	cmp	ax,es:[bx].itBase.Offs
	jne	@@1
	mov	bx,es:[bx].itBase.Segm
	cmp	dx,es:[bx]
@@1:	ret
EnumCompat	endp

CastOrdinal	proc	near
	les	bx,[si].exType
	cmp	es:[bx].tdType,ttInteger
	jae	_Cast
	ret
CastOrdinal	endp

CastByte	proc	near
	mov	bx,_Byte
	mov	es,SystemUnit
	jmp	short _Cast
CastByte	endp

CastInt	proc	near
	mov	bx,_Integer
	mov	es,SystemUnit
	jmp	short _Cast
CastInt	endp

CastWord	proc	near
	mov	bx,_Word
	mov	es,SystemUnit
	jmp	short _Cast
CastWord	endp

CastLong	proc	near
	mov	bx,_Longint
	mov	es,SystemUnit
_Cast	label	near
	cmp	[di].exLocation,elImmediate
	jne	@@2
	mov	ax,[di].itUpperBound.W0
	mov	dx,[di].itUpperBound.W2
	call	ImmedRangeCheck
	jc	@@1
	mov	al,es:[bx].tdModifier
	or	al,IndexModifier
	mov	[di].exModifier,al
	ret
@@1:	mov	ax,76
	Chain	CompileError
@@2:	test	CompilerOptions,coRangeChk
	jnz	@@4
@@3:	mov	al,es:[bx].tdModifier
	or	al,IndexModifier
	Chain	ConvertOrdinal
@@4:	xor	ax,ax
	mov	dx,ax
	test	[di].exModifier,emSigned
	jz	@@5
	mov	ax,-128
	dec	dx
	test	[di].exModifier,emX
	jz	@@5
	mov	ax,-32768
	test	[di].exModifier,emXX
	jz	@@5
	xchg	ax,dx
	inc	ax
@@5:	call	ImmedRangeCheck
	jc	@@8
	mov	ax,127
	xor	dx,dx
	test	[di].exModifier,emUnsigned
	jz	@@6
	mov	al,255
@@6:	test	[di].exModifier,emX
	jz	@@7
	mov	ah,al
	mov	al,255
	test	[di].exModifier,emXX
	jz	@@7
	mov	dx,ax
	mov	ax,65535
@@7:	call	ImmedRangeCheck
	jnc	@@3
@@8:	push	es bx
	push	es:[bx].itUpperBound
	push	es:[bx].itLowerBound
	mov	bx,sp
	mov	ax,8
	Invoke	PutCodeConst
	push	ax bx dx
	mov	al,emLongint
	Invoke	ConvertOrdinal
	Invoke	UseExpr
	mov	al,lvAX
	Invoke	LoadValue
	mov	al,0bfh			; mov	ax,
	Invoke	PutByte
	pop	dx bx ax
	mov	cx,ffCode+ffOffs
	Invoke	PutFixup
	mov	ax,_RangeCheck
	Invoke	PutSystemCall
	Invoke	DoneExpr
	add	sp,8
	pop	bx es
	jmp	@@3
CastLong	endp

ImmedRangeCheck	proc	near
	cmp	dx,es:[bx].itLowerBound.W2
	jg	@@1
	jl	@@3
	cmp	ax,es:[bx].itLowerBound.W0
	jb	@@3
@@1:	cmp	dx,es:[bx].itUpperBound.W2
	jl	@@2
	jg	@@3
	cmp	ax,es:[bx].itUpperBound.W0
	ja	@@3
@@2:	clc
	ret
@@3:	stc
	ret
ImmedRangeCheck	endp

	end

⌨️ 快捷键说明

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