link.asm

来自「Turbo Pascal 6.0编译器源码」· 汇编 代码 · 共 955 行 · 第 1/2 页

ASM
955
字号
	mov	CodeSize.W0,ax
	mov	CodeSize.W2,dx
	ret
@@11:	mov	ax,107
	Chain	CompileError
CountSizes	endp

FormData	proc	near
	mov	bx,2
	mov	si,uhConstMap
	call	FormMap
	mov	ConstSize,bx
	mov	si,uhDataMap
	call	FormMap
	mov	DataSize,bx
	cmp	bx,0fff0h
	ja	Err2
	ret
FormData	endp

FormMap	proc	near
	mov	ax,FirstUnit
@@1:	mov	es,ax
	mov	di,es:[si]
	mov	dx,es:[si+2]
	jmp	short @@4
@@2:	cmp	es:[di].smAddr,-1
	je	@@3
	mov	es:[di].smAddr,bx
	add	bx,es:[di].smLength
	jc	Err2
@@3:	add	di,size TSegMap
@@4:	cmp	di,dx
	jne	@@2
	mov	ax,es:uhNext
	or	ax,ax
	jnz	@@1
	ret
FormMap	endp

Err2:	mov	ax,49
	Chain	CompileError

CalcDataSeg	proc	near
	mov	es,SystemUnit
	mov	di,es:uhConstMap
	mov	ax,es:[di].smAddr
	mov	DataSegment.Offs,ax
	mov	ax,DataSize
	add	ax,15
	mov	cl,4
	shr	ax,cl
	add	ax,DataStart
	mov	StackStart,ax
	ret
CalcDataSeg	endp

CreateExe	proc	near
	mov	ax,RelocCount
	Invoke	GetMemOnBottom
	mov	Relocations,bx
	mov	ax,ConstSize
	Invoke	GetMemOnBottom
	mov	DataSegment.Segm,bx
	mov	si,UnitName
	lea	di,ExeName
	Invoke	CopyDSCStr
	mov	ax,feExe+feForceExt+(fdOutputDir+fdNoEditor)*256
	lea	dx,ExeName
	Invoke	ConvertName
	lea	dx,ExeName
	Invoke	CreateHandle
	mov	ExeHandle,ax
	mov	ax,RelocCount
	add	ax,15
	and	ax,0fff0h
	xor	dx,dx
	xor	cx,cx
	mov	bx,ExeHandle
	Chain	SeekHandle
CreateExe	endp

ResolveCode	proc	near
	mov	ax,es:uhCodeFixupSeg
	mov	bx,es:uhCodeSeg
	mov	di,es:uhCodeMap
	mov	dx,es:uhConstMap
	jmp	short @@1
ResolveConst	label	near
	mov	ax,es:uhConstFixupSeg
	mov	bx,es:uhConstSeg
	mov	di,es:uhConstMap
	mov	dx,es:uhDataMap
@@1:	mov	CurrentUnit,es
	mov	CurrentFixup,ax
	mov	CurrentTarget.Segm,bx
	xor	bx,bx
	xor	si,si
	jmp	short @@4
@@2:	mov	ax,es:[di].smAddr
	cmp	ax,-1
	je	@@3
	mov	CurrentSource,ax
	mov	CurrentTarget.Offs,bx
	push	bx dx si di es
	call	ResolveFixup
	pop	es di si dx bx
@@3:	add	bx,es:[di].smLength
	add	si,es:[di].smFixupLength
	add	di,size TSegMap
@@4:	cmp	di,dx
	jne	@@2
	ret
ResolveCode	endp

ResolveFixup	proc	near
	push	bp
	mov	bp,es:[di].smFixupLength
	add	bp,si
	jmp	@@10
@@1:	mov	es,CurrentFixup
	seges	lodsw
	xchg	ax,cx
	seges	lodsw
	xchg	ax,bx
	seges	lodsw
	xchg	ax,dx
	seges	lodsw
	xchg	ax,dx
	mov	es,CurrentUnit
	mov	di,cx
	and	di,0fffh
	add	di,es:uhUnits
	mov	es,es:[di].ulSegment
	test	cx,ffData
	jz	@@3
	test	cx,ffCode
	jnz	@@2
	add	bx,es:uhDataMap
	add	ax,es:[bx].smAddr
	mov	bx,DataStart
	jmp	short @@7
@@2:	add	bx,es:uhConstMap
	add	ax,es:[bx].smAddr
	mov	bx,DataStart
	jmp	short @@7
@@3:	test	cx,ffCode
	jnz	@@5
	add	bx,es:uhProcMap
	test	cx,ffPtr
	jz	@@4
	cmp	es:uhOverlayLength,0
	je	@@4
	mov	ax,es:[bx].pmStub
	jmp	short @@6
@@4:	add	ax,es:[bx].pmEntryPoint
	mov	bx,es:[bx].pmCodeMap
@@5:	add	bx,es:uhCodeMap
	add	ax,es:[bx].smAddr
@@6:	mov	bx,es:uhCodeStart
@@7:	les	di,CurrentTarget
	add	di,dx
	test	cx,ffOffs
	jnz	@@8
	test	cx,ffSegm
	jnz	@@9
	add	dx,CurrentSource
	sub	ax,dx
	dec	ax
	dec	ax
@@8:	stosw
	test	cx,ffSegm
	jz	@@10
@@9:	xchg	ax,bx
	stosw
@@10:	cmp	si,bp
	je	@@11
	jmp	@@1
@@11:	pop	bp
	ret
ResolveFixup	endp

SqueezeCode	proc	near
	mov	ax,es:uhCodeSeg
	mov	bx,CodeBuffer
	mov	di,es:uhCodeMap
	mov	dx,es:uhConstMap
	jmp	short @@1
SqueezeConst	label	near
	mov	ax,es:uhConstSeg
	mov	bx,DataSegment.Segm
	mov	di,es:uhConstMap
	mov	dx,es:uhDataMap
@@1:	xor	si,si
	jmp	short @@4
@@2:	cmp	es:[di].smAddr,-1
	je	@@3
	push	si di ds es
	mov	cx,es:[di].smLength
	mov	di,es:[di].smAddr
	mov	ds,ax
	mov	es,bx
	Invoke	MoveBlock
	pop	es ds di si
@@3:	add	si,es:[di].smLength
	add	di,size TSegMap
@@4:	cmp	di,dx
	jne	@@2
	ret
SqueezeCode	endp

SaveCode	proc	near
	mov	dx,CodeBuffer
	mov	cx,es:uhCodeLength
	mov	bx,ExeHandle
	Chain	BigWrite
SaveCode	endp

CodeRelocs	proc	near
	mov	ax,es:uhCodeFixupSeg
	mov	bx,es:uhCodeStart
	mov	di,es:uhCodeMap
	mov	dx,es:uhConstMap
	jmp	short @@1
ConstRelocs	label	near
	mov	ax,es:uhConstFixupSeg
	mov	bx,DataStart
	mov	di,es:uhConstMap
	mov	dx,es:uhDataMap
@@1:	mov	CurrentFixup,ax
	xor	si,si
	jmp	short @@4
@@2:	cmp	es:[di].smAddr,-1
	jz	@@3
	push	dx si di es
	call	Fixup2Reloc
	pop	es di si dx
@@3:	add	si,es:[di].smFixupLength
	add	di,size TSegMap
@@4:	cmp	di,dx
	jne	@@2
	ret
CodeRelocs	endp

Fixup2Reloc	proc	near
	mov	cx,es:[di].smAddr
	mov	dx,es:[di].smFixupLength
	add	dx,si
	mov	di,RelocPtr
	jmp	short @@4
@@1:	mov	es,CurrentFixup
	test	es:[si].fiUnit,ffSegm
	jz	@@3
	mov	ax,es:[si].fiOffset
	add	ax,cx
	test	es:[si].fiUnit,ffOffs
	jz	@@2
	inc	ax
	inc	ax
@@2:	mov	es,Relocations
	stosw
	mov	ax,bx
	stosw
@@3:	add	si,size TFixup
@@4:	cmp	si,dx
	jne	@@1
	mov	RelocPtr,di
	ret
Fixup2Reloc	endp

OvrCodeReloc	proc	near
	mov	ax,es:uhCodeFixupSeg
	mov	CurrentFixup,ax
	xor	bx,bx
	xor	si,si
	mov	di,es:uhCodeMap
	mov	dx,es:uhConstMap
	jmp	short @@3
@@1:	cmp	es:[di].smAddr,-1
	je	@@2
	push	dx si di es
	call	Fixup2OvrReloc
	pop	es di si dx
@@2:	add	si,es:[di].smFixupLength
	add	di,size TSegMap
@@3:	cmp	di,dx
	jne	@@1
	ret
OvrCodeReloc	endp

Fixup2OvrReloc	proc	near
	mov	cx,es:[di].smAddr
	mov	dx,es:[di].smFixupLength
	add	dx,si
	mov	di,bx
	jmp	short @@4
@@1:	mov	es,CurrentFixup
	test	es:[si].fiUnit,ffSegm
	jz	@@3
	mov	ax,es:[si].fiOffset
	add	ax,cx
	test	es:[si].fiUnit,ffOffs
	jz	@@2
	inc	ax
	inc	ax
@@2:	mov	es,CodeBuffer
	stosw
@@3:	add	si,size TFixup
@@4:	cmp	si,dx
	jne	@@1
	mov	bx,di
	ret
Fixup2OvrReloc	endp

FormOvrSeg	proc	near
	push	ds OverlayLink OverlaySize es
	mov	es,CodeBuffer
	pop	ds
	xor	di,di
	mov	ax,3fcdh
	stosw
	xor	ax,ax
	stosw
	pop	ax
	stosw
	pop	ax
	stosw
	mov	ax,ds:uhOverlayLength
	stosw
	mov	ax,ds:uhCodeRelocs
	shl	ax,1
	stosw
	mov	ax,ds:uhCodeLength
	sub	ax,ovRecSize
	cwd
	mov	cx,5
	div	cx
	stosw
	pop	ax
	stosw
	mov	cx,8
	xor	ax,ax
	rep	stosw
	mov	si,ds:uhProcMap
@@1:	cmp	ds:[si].pmStub,0
	je	@@2
	mov	ax,3fcdh
	stosw
	mov	ax,[si].pmEntryPoint
	mov	bx,[si].pmCodeMap
	add	bx,ds:uhCodeMap
	add	ax,[bx].smAddr
	stosw
	xor	al,al
	stosb
@@2:	add	si,size TProcMap
	cmp	si,ds:uhCodeMap
	jne	@@1
	push	ds
	pop	es ds
	mov	ax,es:uhOverlayLength
	add	OverlaySize.W0,ax
	adc	OverlaySize.W2,0
	mov	ax,es:uhCodeRelocs
	shl	ax,1
	add	OverlaySize.W0,ax
	adc	OverlaySize.W2,0
	mov	ax,es:uhCodeStart
	mov	OverlayLink,ax
	ret
FormOvrSeg	endp

SaveOvrCode	proc	near
	xor	ax,ax
	mov	dx,CodeBuffer
	mov	cx,es:uhOverlayLength
	mov	bx,FileHandle
	Chain	WriteHandle
SaveOvrCode	endp

SaveOvrRelocs	proc	near
	xor	ax,ax
	mov	dx,CodeBuffer
	mov	cx,es:uhCodeRelocs
	shl	cx,1
	mov	bx,FileHandle
	Chain	WriteHandle
SaveOvrRelocs	endp

FormExe	proc	near
	les	di,DataSegment
	xor	bx,bx
	mov	es:[bx],bx
	mov	ax,OverlayLink
	mov	es:[di]._OvrCodeList,ax
	mov	ax,MaxOverlaySize
	mov	es:[di]._OvrHeapSize,ax
	mov	dx,es
	mov	cx,ConstSize
	mov	bx,ExeHandle
	Invoke	BigWrite
	Invoke	GetFileSize
	mov	ExeFileSize.W0,ax
	mov	ExeFileSize.W2,dx
	mov	es,Relocations
	mov	word ptr es:[0],'ZM'
	mov	ax,RelocCount
	add	ax,15
	mov	cl,4
	shr	ax,cl
	mov	es:[8],ax
	add	ax,DataStart
	mov	bx,ConstSize
	add	bx,15
	mov	cl,4
	shr	bx,cl
	add	ax,bx
	mov	bx,ax
	and	ax,1fh
	mov	cl,4
	shl	ax,cl
	mov	es:[2],ax
	add	bx,1fh
	mov	cl,5
	shr	bx,cl
	mov	es:[4],bx
	mov	ax,RelocCount
	sub	ax,1ch
	shr	ax,1
	shr	ax,1
	mov	es:[6],ax
	mov	ax,ConstSize
	add	ax,15
	mov	cl,4
	shr	ax,cl
	add	ax,DataStart
	mov	bx,StackSize
	add	bx,15
	mov	cl,4
	shr	bx,cl
	add	bx,StackStart
	add	bx,MaxOverlaySize
	sub	bx,ax
	mov	ax,MinHeapSize
	add	ax,bx
	jnc	@@1
	mov	ax,-1
@@1:	mov	es:[10],ax
	mov	ax,MaxHeapSize
	add	ax,bx
	jnc	@@2
	mov	ax,-1
@@2:	mov	es:[12],ax
	mov	ax,StackStart
	mov	es:[14],ax
	mov	ax,StackSize
	mov	es:[16],ax
	mov	word ptr es:[24],1ch
	mov	word ptr es:[18],0
	mov	es,Dictionary.Segm
	mov	di,es:uhProcMap
	mov	ax,es:[di].pmEntryPoint
	mov	di,es:[di].pmCodeMap
	add	di,es:uhCodeMap
	add	ax,es:[di].smAddr
	mov	es,Relocations
	mov	es:[20],ax
	mov	word ptr es:[22],0
	mov	word ptr es:[26],0
	mov	dx,es
	mov	cx,RelocCount
	mov	bx,ExeHandle
	Chain	BigWrite
FormExe	endp

	end

⌨️ 快捷键说明

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