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

📄 le23p.asm

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        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 + -