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

📄 opers.asm

📁 Turbo Pascal 6.0编译器源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
@@3:	Invoke	Cond2Number
	xchg	si,di
	Invoke	Cond2Number
	xchg	si,di
OrdinalOper	label	near
	mov	al,[di].exLocation
	mov	ah,[si].exLocation
	cmp	ax,elAddress+elImmediate*256
	je	@@4
	cmp	ax,elImmediate+elAddress*256
	jne	@@6
	cmp	Oper,opPlus
	jne	@@6
	call	SwapOperands
@@4:	test	[di].exMisc,efSeg
	jnz	@@6
	mov	dx,[si].exValue.Offs
	mov	al,Oper
	cmp	al,opPlus
	je	@@5
	cmp	al,opMinus
	jne	@@6
	neg	dx
@@5:	add	[di].exValue.Offs,dx
	ret
@@6:	Invoke	LoadAddress
	xchg	si,di
	Invoke	LoadAddress
	xchg	si,di
	mov	al,[di].exModifier
	mov	ah,[si].exModifier
	Invoke	IntExtension
	cmp	Oper,opAnd
	jae	@@7
	test	al,emX
	jnz	@@7
	and	al,emSigned
	or	al,emX
@@7:	push	ax
	Invoke	ConvertOrdinal
	xchg	si,di
	pop	ax
	Invoke	ConvertOrdinal
	xchg	si,di
	call	SwapIfNeeded
	cmp	Oper,opEqual
	jb	@@9
	test	[di].exModifier,emXX
	jnz	@@8
	call	IntCompare
	jmp	short @@14
@@8:	call	LongCompare
	jmp	short @@14
@@9:	test	[di].exModifier,emXX
	jz	@@10
	mov	al,erAX+erDX
	Invoke	FreeRegs
	lea	bx,LongOps
	jmp	short @@13
@@10:	cmp	Oper,opTimes
	jne	@@11
	cmp	[si].exLocation,elImmediate
	jne	@@11
	Invoke	UseExpr
	mov	al,lvAX
	mov	cx,[si].exValue.W0
	Invoke	Scale
	jmp	short @@14
@@11:	mov	al,erAX+erDX
	cmp	Oper,opDiv
	je	@@12
	cmp	Oper,opMod
	je	@@12
	mov	al,erAX
@@12:	Invoke	FreeRegs
	lea	bx,WordOps
@@13:	mov	al,Oper
	xor	ah,ah
	shl	ax,1
	shl	ax,1
	add	bx,ax
	mov	dx,cs:[bx+2]
	xchg	si,di
	call	word ptr cs:[bx]
	xchg	si,di
@@14:	Invoke	DoneExpr
	mov	al,[si].exRegsUsed
	or	[di].exRegsUsed,al
	ret
BooleanOper	endp

IOrdinalOper	proc	near
	cmp	Oper,opEqual
	jb	@@2
	mov	ax,[di].exValue.W2
	add	ah,80h
	mov	dx,[si].exValue.W2
	add	dh,80h
	cmp	ax,dx
	jne	@@1
	mov	ax,[di].exValue.W0
	cmp	ax,[si].exValue.W0
@@1:	jmp	CheckCondition
@@2:	call	LongArith
	jmp	SetValue
IOrdinalOper	endp

LongArith	proc	near
	mov	bl,Oper
	xor	bh,bh
	shl	bx,1
	push	cs:@@1[bx]
	mov	ax,[di].exValue.W0
	mov	dx,[di].exValue.W2
	mov	cx,[si].exValue.W0
	mov	bx,[si].exValue.W2
	ret
@@1	dw	@@Add
	dw	@@Sub
	dw	@@Mul
	dw	@@Div
	dw	@@Mod
	dw	@@Shl
	dw	@@Shr
	dw	@@And
	dw	@@Or
	dw	@@Xor
@@Add:	add	ax,cx
	adc	dx,bx
	ret
@@Sub:	sub	ax,cx
	sbb	dx,bx
	ret
@@Mul:	Chain	MulLong
@@Div:	Chain	DivLong
@@Mod:	Invoke	DivLong
	mov	ax,cx
	mov	dx,bx
	ret
@@Shl:	and	cx,1fh
	jz	@@3
@@2:	shl	ax,1
	rcl	dx,1
	loop	@@2
@@3:	ret
@@Shr:	and	cx,1fh
	jz	@@5
@@4:	shr	dx,1
	rcr	ax,1
	loop	@@4
@@5:	ret
@@And:	and	ax,cx
	and	dx,bx
	ret
@@Or:	or	ax,cx
	or	dx,bx
	ret
@@Xor:	xor	ax,cx
	xor	dx,bx
	ret
LongArith	endp

SetValue	proc	near
	mov	[di].exValue.W0,ax
	mov	[di].exValue.W2,dx
	Invoke	FitConstType
	mov	[di].exModifier,al
	ret
SetValue	endp

WordOps	dw	WordAdd,4000h		; add, inc
	dw	WordAdd,4828h		; sub, dec
	dw	WordMul,20f7h		; mul
	dw	WordDiv,30f7h		; div
	dw	WordMod,30f7h		; div
	dw	WordShl,0e0d1h		; shl
	dw	WordShl,0e8d1h		; shr
	dw	WordAnd,20h		; and
	dw	WordAnd,8		; or
	dw	WordAnd,30h		; xor

WordAdd	proc	near
	cmp	[di].exLocation,elImmediate
	jne	WordAnd
	mov	ax,[di].exValue.W0
	dec	ax
	jz	@@1
	dec	ax
	jnz	WordAnd
	call	@@1
@@1:	mov	al,dh
	Chain	PutByte
WordAdd	endp

WordAnd	proc	near
	Chain	PutArOpAX
WordAnd	endp

WordDiv	proc	near
	cmp	[di].exLocation,elImmediate
	jne	DivMod
	mov	cx,[di].exValue.W0
	jcxz	@@1
	Chain	BackScale
@@1:	mov	ax,62
	Chain	CompileError
WordDiv	endp

DivMod	proc	near
	test	[di].exModifier,emSigned
	jz	@@1
	or	dh,8			; idiv
@@1:	test	[di].exModifier,emUnsigned
	jz	@@2
	mov	ax,0d231h		; xor	dx,dx
	Invoke	PutWord
	jmp	short @@3
@@2:	mov	al,99h			; cwd
	Invoke	PutByte
@@3:	cmp	[di].exLocation,elImmediate
	jne	@@4
	push	dx
	mov	al,lvCX
	Invoke	LoadValue
	pop	dx
WordMul	label	near
@@4:	Invoke	AddReg
	or	[di].exRegsUsed,erDX
	ret
DivMod	endp

WordMod	proc	near
	call	DivMod
	mov	al,92h			; xchg	ax,dx
	Chain	PutByte
WordMod	endp

WordShl	proc	near
	cmp	[di].exLocation,elImmediate
	jne	@@2
	cmp	[di].exValue.B0,1
	jne	@@1
	mov	ax,dx
	Chain	PutWord
@@1:	test	CompilerOptions,co286Code
	jz	@@2
	mov	ax,dx
	and	al,0efh
	Invoke	PutWord
	mov	al,[di].exValue.B0
	Chain	PutByte
@@2:	push	dx
	mov	al,lvCX
	Invoke	LoadValue
	pop	ax
	or	al,2
	Chain	PutWord
WordShl	endp

IntCompare	proc	near
	cmp	[di].exLocation,elMemory
	jne	@@1
	cmp	[si].exLocation,elImmediate
	jne	@@1
	Invoke	UseExpr
	mov	ax,[si].exValue.W0
	mov	dl,38h			; cmp
	Invoke	PutArOpRMImm
	jmp	short @@4
@@1:	mov	al,erAX
	Invoke	FreeRegs
	cmp	[si].exLocation,elImmediate
	jne	@@3
	cmp	[si].exValue.W0,0
	jne	@@3
	mov	ax,0c009h		; or	ax,ax
	test	[di].exModifier,emX
	jnz	@@2
	mov	ax,0c008h		; or	al,al
@@2:	Invoke	PutWord
	jmp	short @@4
@@3:	xchg	si,di
	mov	dl,38h			; cmp
	Invoke	PutArOpAX
	xchg	si,di
@@4:	lea	bx,SignedConds
	test	[di].exModifier,emUnsigned
	jz	@@5
	lea	bx,UnsignedConds
@@5:	jmp	SetCondition
IntCompare	endp

LongOps	dw	LongAdd,1000h		; add, adc
	dw	LongAdd,1828h		; sub, sbb
	dw	LongMul,_LongMul
	dw	LongMul,_LongDiv
	dw	LongMod,_LongDiv
	dw	LongMul,_LongShl
	dw	LongMul,_LongShr
	dw	LongAdd,20h		; and
	dw	LongAdd,8		; or
	dw	LongAdd,30h		; xor

LongAdd	proc	near
	push	dx
	Invoke	PutArOpAX
	mov	ax,2
	Invoke	SwapSegOfs
	pop	dx
	or	dh,dh
	jz	@@1
	mov	dl,dh
	Chain	PutArOp
@@1:	Chain	PutLogOp
LongAdd	endp

LongMul	proc	near
	push	dx
	mov	al,lvCX
	Invoke	LoadValue
	pop	ax
	Chain	PutSystemCall
LongMul	endp

LongMod	proc	near
	call	LongMul
	mov	ax,0c889h		; mov	ax,cx
	Invoke	PutWord
	mov	ax,0da89h		; mov	dx,bx
	Chain	PutWord
LongMod	endp

LongCompare	proc	near
	xor	ax,ax
	mov	Chain1,ax
	mov	Chain2,ax
	cmp	[si].exLocation,elImmediate
	jne	@@4
	mov	ax,[si].exValue.W0
	or	ax,[si].exValue.W2
	jnz	@@3
	mov	al,Oper
	cmp	al,opEqual
	je	@@1
	cmp	al,opNotEqual
	jne	@@3
@@1:	cmp	[di].exLocation,elMemory
	jne	@@2
	Invoke	UseExpr
	and	[di].exModifier,not emXX
	mov	al,lvAX
	Invoke	LoadReg
	add	[di].exValue.Offs,2
	mov	dx,8			; or
	Invoke	PutArOpAX
	or	[di].exRegsUsed,erAX
	jmp	short @@5
@@2:	Invoke	UseExpr
	mov	ax,0d009h		; or	ax,dx
	Invoke	PutWord
	jmp	short @@5
@@3:	cmp	[di].exLocation,elMemory
	jne	@@4
	Invoke	UseExpr
	add	[di].exValue.Offs,2
	mov	ax,[si].exValue.W2
	mov	dl,38h			; cmp
	Invoke	PutArOpRMImm
	call	TwoConditions
	sub	[di].exValue.Offs,2
	mov	ax,[si].exValue.W0
	mov	dl,38h			; cmp
	Invoke	PutArOpRMImm
	jmp	short @@5
@@4:	mov	al,erAX+erDX
	Invoke	FreeRegs
	xchg	si,di
	mov	ax,2
	Invoke	SwapSegOfs
	mov	dl,38h			; cmp
	Invoke	PutArOp
	call	TwoConditions
	mov	ax,-2
	Invoke	SwapSegOfs
	mov	dl,38h			; cmp
	Invoke	PutArOpAX
	xchg	si,di
@@5:	lea	bx,UnsignedConds
	call	SetCondition
	mov	ax,Chain1
	mov	[di].exChain1,ax
	mov	ax,Chain2
	mov	[di].exChain2,ax
	ret
LongCompare	endp

TwoConditions	proc	near
	mov	bl,Oper
	xor	bh,bh
	shl	bx,1
	mov	ax,cs:@@3[bx-opEqual*2]
	or	al,al
	jz	@@1
	push	ax
	lea	bx,Chain1
	Invoke	PutJmp
	pop	ax
@@1:	mov	al,ah
	or	al,al
	jz	@@2
	lea	bx,Chain2
	Chain	PutJmp
@@2:	ret
@@3	dw	cdNotEqual*256
	dw	cdNotEqual
	dw	cdGreater+cdLess*256
	dw	cdLess+cdGreater*256
	dw	cdGreater+cdLess*256
	dw	cdLess+cdGreater*256
TwoConditions	endp

SwapIfNeeded	proc	near
	mov	al,Oper
	cmp	al,opEqual
	jae	@@1
	cmp	al,opPlus
	je	@@1
	cmp	al,opTimes
	je	@@1
	cmp	al,opAnd
	je	@@1
	cmp	al,opOr
	je	@@1
	cmp	al,opXor
	jne	@@2
@@1:	cmp	[si].exLocation,elImmediate
	je	@@2
	cmp	[di].exLocation,elImmediate
	je	SwapOperands
	cmp	[si].exRegsUsed,0
	je	@@2
	cmp	[di].exRegsUsed,0
	je	SwapOperands
	cmp	[si].exRegsUsed,erAll
	je	@@2
	cmp	[di].exRegsUsed,erAll
	je	SwapOperands
@@2:	ret
SwapIfNeeded	endp

SwapOperands	proc	near
	mov	cx,size TExpr shr 1
@@1:	mov	ax,[si]
	xchg	ax,[di]
	mov	[si],ax
	add	di,2
	add	si,2
	loop	@@1
	sub	di,size TExpr
	sub	si,size TExpr
	mov	al,Oper
	cmp	al,opSlash
	je	@@2
	cmp	al,opGreater
	jb	@@2
	xor	Oper,1
@@2:	ret
SwapOperands	endp

SetCondition	proc	near
	mov	al,Oper
	sub	al,opEqual
	segcs	xlat
_SetCondition	label	near
	mov	[di].exLocation,elCondition
	mov	[di].exModifier,emBoolean
	mov	[di].exMisc,al
l4b7f:	xor	ax,ax
	mov	[di].exChain1,ax
l4b84:	mov	[di].exChain2,ax
	Chain	CastBoolean
SetCondition	endp

UnsignedConds	db	cdEqual,cdNotEqual,cdAfter,cdBelow,cdNotBelow,cdNotAfter
SignedConds	db	cdEqual,cdNotEqual,cdGreater,cdLess,cdNotLess,cdNotGreater

CheckCondition	proc	near
	lahf
	mov	bl,Oper
	xor	bh,bh
	shl	bx,1
	shl	bx,1
	add	bx,offset @@1-opEqual*4
	mov	al,1
	sahf
	jmp	bx
@@1:	jz	@@3
	jmp	short @@2
	jnz	@@3
	jmp	short @@2
	ja	@@3
	jmp	short @@2
	jb	@@3
	jmp	short @@2
	jae	@@3
	jmp	short @@2
	jbe	@@3
@@2:	mov	al,0
StoreBoolean	label	near
@@3:	cbw
	cwd
	mov	[di].exModifier,emBoolean
	mov	[di].exValue.W0,ax
	mov	[di].exValue.W2,dx
	Chain	CastBoolean
CheckCondition	endp

	end

⌨️ 快捷键说明

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