📄 le23p.asm
字号:
include system.inc
include cw.inc
include strucs.inc
_Seg_ struc
Seg_BaseAddress dd ?
Seg_Type dd ?
Seg_Length dd ?
Seg_Memory dd ?
_Seg_ ends
.code
;------------------------------------------------------------------------------
_ASMMain proc near
public _ASMMain
pushs esi,edi,ebp
mov StackStore,esp
;
mov esi,offset Copyright ;Anounce what we are.
calls PrintString,esi
;
call ReadCommand ;Get command line and options.
mov ErrorNumber,1
cmp eax,1 ;Got a file name?
jc ASMExit
;
cmp OptionPointers+4,0
jnz @@gotoutname
mov eax,OptionPointers
mov OptionPointers+4,eax
@@gotoutname: ;
;Add .EXE to input name if needed.
;
IFDEF DEBUG
push eax
push ebx
push ecx
push edx
push ds
mov edx,OFFSET debug6
mov ecx,SIZEOF debug6
mov ebx,1
mov ah,40h
int 21h
jmp med6
debug6 DB 'Before strcpy 1',13,10
med6:
pop ds
pop edx
pop ecx
pop ebx
pop eax
ENDIF
callc strcpy,offset InNameSpace,OptionPointers
IFDEF DEBUG
push eax
push ebx
push ecx
push edx
push ds
mov edx,OFFSET debug7
mov ecx,SIZEOF debug7
mov ebx,1
mov ah,40h
int 21h
jmp med7
debug7 DB 'After strcpy 1',13,10
med7:
pop ds
pop edx
pop ecx
pop ebx
pop eax
ENDIF
mov OptionPointers,offset InNameSpace
mov esi,OptionPointers
xor edi,edi
@@e0: inc esi
cmp b[esi-1],0
jz @@e2
cmp b[esi-1],"."
jz @@e1
cmp b[esi-1],"\"
jnz @@e0
xor edi,edi
jmp @@e0
@@e1: mov edi,esi
jmp @@e0
@@e2: or edi,edi
jnz @@e3
mov b[esi-1],"."
mov b[esi],"E"
mov b[esi+1],"X"
mov b[esi+2],"E"
mov b[esi+3],0
@@e3:
;Add .EXE to output name if needed.
;
IFDEF DEBUG
push eax
push ebx
push ecx
push edx
push ds
mov edx,OFFSET debug4
mov ecx,SIZEOF debug4
mov ebx,1
mov ah,40h
int 21h
jmp med4
debug4 DB 'Before strcpy 2',13,10
med4:
pop ds
pop edx
pop ecx
pop ebx
pop eax
ENDIF
callc strcpy,offset OutNameSpace,OptionPointers+4
IFDEF DEBUG
push eax
push ebx
push ecx
push edx
push ds
mov edx,OFFSET debug5
mov ecx,SIZEOF debug5
mov ebx,1
mov ah,40h
int 21h
jmp med5
debug5 DB 'After strcpy 2',13,10
med5:
pop ds
pop edx
pop ecx
pop ebx
pop eax
ENDIF
mov OptionPointers+4,offset OutNameSpace
mov esi,OptionPointers+4
xor edi,edi
@@e20: inc esi
cmp b[esi-1],0
jz @@e22
cmp b[esi-1],"."
jz @@e21
cmp b[esi-1],"\"
jnz @@e20
xor edi,edi
jmp @@e20
@@e21: mov edi,esi
jmp @@e20
@@e22: or edi,edi
jnz @@e23
mov b[esi-1],"."
mov b[esi],"E"
mov b[esi+1],"X"
mov b[esi+2],"E"
mov b[esi+3],0
@@e23:
IFDEF DEBUG
push eax
push ebx
push ecx
push edx
push ds
mov edx,OFFSET debug8
mov ecx,SIZEOF debug8
mov ebx,1
mov ah,40h
int 21h
jmp med8
debug8 DB 'Calling Fetch...',13,10
med8:
pop ds
pop edx
pop ecx
pop ebx
pop eax
ENDIF
call FetchLEFile ;Read the LE file.
jc ASMExit
;
call Create3PFile ;Create the 3P image.
jc ASMExit
;
call CreateRelocations ;Build relocation list.
jc ASMExit
;
call Create3PHeader ;Build the header.
jc ASMExit
;
call Write3PFile ;Now write the 3P file.
jc ASMExit
;
mov ErrorNumber,0
jmp ASMExit
_ASMMain endp
;------------------------------------------------------------------------------
ASMExit proc near
mov eax,ErrorNumber
mov esi,[ErrorList+eax*4]
calls PrintString,esi
;
mov esp,StackStore
pops esi,edi,ebp
ret
ASMExit endp
;------------------------------------------------------------------------------
;
;Create a 3P format relocation table from the LE fixup tables.
;
CreateRelocations proc near
mov esi,offset BuildRelocsText
calls PrintString,esi
IFDEF DEBUG2
; int 3
ENDIF
;
;Setup a pointer to the object definitions.
;
mov RelocationCount,0
;
mov esi,LEAddress
mov ecx,[esi+44h] ;Get number of Objects.
add esi,[esi+40h] ;Point to object table.
mov ObjectCount,ecx
mov ObjectBase,esi
mov eax,ObjectList
add eax,4
mov SegmentList,eax
;
@@0: mov esi,ObjectBase
mov ecx,[esi+10h] ;Get number of pages.
; MED 09/06/97
test ecx,ecx
je mednextobj2
mov PageCount,ecx
mov PageCount+4,0
mov edx,[esi+0Ch] ;Get page table index.
dec edx
mov ebp,edx ;Set base page map entry.
@@1: ;
mov edx,ebp
mov esi,LEAddress
add esi,[esi+68h] ;Point to fixup page maps.
mov ecx,[esi+4+edx*4] ;Get next offset.
mov edx,[esi+edx*4] ;Get start offset.
sub ecx,edx ;Get number of bytes
jz @@4
;
mov esi,LEAddress
add esi,[esi+6Ch] ;Point to fixup data.
add esi,edx ;Move to start of this pages fixups.
;
@@2: mov al,[esi] ;Get type byte.
mov bl,al
shr bl,4 ;Get single/multiple flag.
mov bh,al
and bh,15 ;Get type.
inc esi
dec ecx
mov al,[esi] ;Get second type byte.
mov dl,al
and dl,3 ;Get internal/external specifier.
mov dh,al
shr dh,2 ;Get destination type.
inc esi
dec ecx
;
or bl,bl ;check for single entry
jz @@multok
cmp bl,1
jz @@multok
mov ErrorNumber,9
jmp @@9
@@multok: ;
mov ErrorNumber,10
or dl,dl ;Check it's an internal target.
jnz @@9
mov ErrorNumber,13
test dh,111011b ;Check for unknown bits.
IFNDEF DEBUG2
jnz @@9
ELSE
jz med2
int 3
med2:
ENDIF
cmp bh,0010b ;Word segment?
jz @@Seg16
cmp bh,0111b ;32-bit offset?
jz @@32BitOff
cmp bh,0110b ;Seg:32-bit offset?
jz @@Seg1632BitOff
cmp bh,1000b ;32-bit self relative?
jz @@Self32Off
cmp bh,0101b ;16-bit offset?
jz @@16BitOff
cmp bh,0011b ;16-bit dword?
jz @@16bitdword
; MED 12/23/96
cmp bh,1 ; ignore fixup ???
je @@3
mov ErrorNumber,11
jmp @@9
@@16bitdword:
;EBP - Page offset within segment.
;w[esi] - offset within page.
;b[esi+2] - target object+1.
;w[esi+3] - target offset
;
mov edi,SegmentList
mov edi,Seg_Memory[edi]
mov eax,PageCount+4 ;Get page number.
shl eax,12
add edi,eax ;Point to the right page.
movsx eax,w[esi]
or eax,eax
js @@Neg160
add edi,eax ;Point to the right offset.
movzx eax,b[esi+2] ;Get the target segment.
dec eax
mov [edi+2],ax ;Store target.
;
mov edi,SegmentList
mov edi,Seg_BaseAddress[edi] ;Get offset from image start.
mov eax,PageCount+4 ;Get page number within segment.
shl eax,12
add edi,eax ;Include page offset.
movzx eax,w[esi]
add edi,eax ;Include byte offset.
add edi,2
mov eax,edi
call AddRelocationEntry ;Add it to the list.
mov ErrorNumber,6
jc @@9
;
mov edi,SegmentList
mov edi,Seg_Memory[edi]
mov eax,PageCount+4 ;Get page number.
shl eax,12
add edi,eax ;Point to the right page.
movsx eax,w[esi]
or eax,eax
js @@Neg160
add edi,eax ;Point to the right offset.
movzx eax,w[esi+3] ;Get target offset.
mov [edi],ax
@@Neg160:
add esi,2+1+2
sub ecx,2+1+2
jmp @@3
@@16BitOff:
;EBP - Page offset within segment.
;w[esi] - offset within page.
;b[esi+2] - target object+1.
;w[esi+3]
mov ErrorNumber,13
; MED 12/27/96
; test dh,4
; jnz @@9
mov edi,SegmentList
mov edi,Seg_Memory[edi]
mov eax,PageCount+4 ;Get page number.
shl eax,12
add edi,eax ;Point to the right page.
movsx eax,w[esi]
or eax,eax
js @@Neg3
add edi,eax ;Point to the right offset.
movzx eax,w[esi+3] ;Get target offset.
test dh,4 ;Target offset may be 32-bit!
jz @@Big3
mov ebx,[esi+3] ;Get target offset.
@@Big3: add eax,ebx
mov [edi],ax
@@Neg3: ;
add esi,2+1+2
sub ecx,2+1+2
test dh,4
jz @@3
add esi,2
sub ecx,2
jmp @@3
@@Seg16: ;Deal with a 16-bit segment.
;
;EBP - Page offset within segment.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -