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 + -
显示快捷键?