add lestub.nasm

This commit is contained in:
Lucia Ceionia 2023-07-06 17:14:03 -05:00
parent 4b7f25c798
commit 5c29ef41ff

148
src/lestub.nasm Normal file
View File

@ -0,0 +1,148 @@
[MAP ALL]
[SECTION MZ start=0x0000]
dw 'MZ' ; 00 magic num
dw 0x0000 ; 02 bytes in last block
dw 0x0006 ; 04 blocks in EXE
dw 0x0000 ; 06 relocations
dw 0x0004 ; 08 paragraphs in header
dw 0x0000 ; 0A paragraphs of additional memory (BSS)
dw 0xffff ; 0C max extra mem
dw 0x0000 ; 0E stack segment relative value
dw 0x0500 ; 10 inital value of SP
dw 0x0000 ; 12 checksum (0)
dw 0x0000 ; 14 inital value of IP
dw 0x0000 ; 16 inital value of CS
dw 0x0040 ; 18 offset of first relocation (0x40 for LE)
dw 0x0000 ; 1A overlay num, 0 for main program
TIMES 0x3C - ($ - $$) db 0
dd 0x00000080 ; 3C LE header offset
[SECTION MSDOS start=0x0040 vstart=0x0000]
; MS-DOS Stub
[BITS 16]
push cs
pop ds
mov dx,stubtext
mov ah,0x9
int 0x21
mov ax,0x4c01
int 0x21
stubtext: db `This program cannot be run in DOS mode. (idiot)\r\n$`
[SECTION LE start=0x0080]
; LE header
LE_HEADER:
dw 'LE' ; 00 LE signature
db 0x00 ; 02 Byte order (little-endian)
db 0x00 ; 03 Word order (little-endian)
dd 0x00000000 ; 04 executable format level
dw 0x0002 ; 08 CPU type (i386)
dw 0x0001 ; 0A Target OS (OS/2)
dd 0x00000000 ; 0C Module version
dd 0x00000200 ; 10 Module type flags
dd 0x00000002 ; 14 Number of memory pages
dd 0x00000001 ; 18 Inital object CS number
dd 0x00000000 ; 1C Inital EIP
dd 0x00000002 ; 20 Inital object SS number
dd 0x00080008 ; 24 Inital ESP
dd 0x00001000 ; 28 Memory page size
dd 0x00001000 ; 2C Bytes on last page
dd 0x00000100 ; 30 Fix-up section size
dd 0x00000000 ; 34 Fix-up section checksum
dd 0x00000000 ; 38 Loader section size
dd 0x00000000 ; 3C Loader section checksum
dd 0x000000c4 ; 40 Offset of object table
dd 0x00000002 ; 44 Object table entries
dd 0x000000f4 ; 48 Object page map offset
dd 0x00000000 ; 4C Object iterate data map offset
dd 0x000000fc ; 50 Resource table offset
dd 0x00000000 ; 54 Resource table entries
dd 0x000000fc ; 58 Resident name tables offset
dd 0x00000105 ; 5C Entry table offset
dd 0x00000000 ; 60 Module directives table offset
dd 0x00000000 ; 64 Module directives entry
dd 0x00000106 ; 68 Fix-up page table offset
dd 0x00000112 ; 6C Fix-up record table offset
dd 0x00000000 ; 70 Imported modules name table offset
dd 0x00000000 ; 74 Imported modules count
dd 0x00000000 ; 78 Imported procedure name table offset
dd 0x00000000 ; 7C Per-page checksum table offset
dd 0x00001000 ; 80 Data pages offset from top of file
dd 0x00000000 ; 84 Preload page count
dd 0x00000000 ; 88 Non-resident names table offset from top of file
dd 0x00000000 ; 8C Non-resident names table length
dd 0x00000000 ; 90 Non-resident names table checksum
dd 0x00000000 ; 94 Automatic data object
dd 0x00000000 ; 98 Debug information offset
dd 0x00000000 ; 9C Debug information length
dd 0x00000000 ; A0 Preload instance pages number
dd 0x00000000 ; A4 Demand instance pages number
dd 0x00000000 ; A8 Extra heap allocation
dd 0x00000000 ; AC ???
TIMES 0xC4 - ($ - LE_HEADER) db 0
; Object Table
; CS @ C4h
dd 0x00080000 ; 00 Virtual segment size
dd 0x00000000 ; 04 Relocation base address
dd 0x00002045 ; 08 Object flags
dd 0x00000001 ; 0C Page map index
dd 0x00000001 ; 10 Page map entries
dd 0x00000000 ; 14 ???
; SS @ DCh
dd 0x00080080 ; 00 Virtual segment size
dd 0x00070000 ; 04 Relocation base address
dd 0x00002043 ; 08 Object flags
dd 0x00000002 ; 0C Page map index
dd 0x00000001 ; 10 Page map entries
dd 0x00000000 ; 14 ???
; Page Map @ F4
; 3 byte Page Number, 1 byte Flags
; 1, Code
db 0x00, 0x00, 0x01 ; 3 byte Page Number
db 0x00 ; Flags
db 0x00, 0x00, 0x02 ; 3 byte Page Number
db 0x00 ; Flags
; Resource Table (0) & Resident Name Table
db 5 ; String Length
db 'hello' ; ASCII string
dw 0x0000 ; Ordinal Number
db 0x00 ; ???
; 105h Entry Table?
db 0x00
; 106h Fixup Page Table
dd 0x00000000 ; Record Offset of Page 1
dd 0x00000007 ; Record Offset of Page 2
dd 0x0000000E ; End of Records
; 112h Fixup Record Table
fixup_table_start:
db 0x07, 0x00 ; 32-bit internal relocation
dw 0x0000 ; source offset in page
db 0x01 ; target object
dw 0x0000 ; text - entry ; target offset
db 0x07, 0x00 ; 32-bit internal relocation
dw 0x0000 ; source offset in page
db 0x02 ; target object
dw 0x0000 ; target offset
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
db 0x07, 0x00, 0xff, 0x00, 0x01, 0x01, 0x00
fixup_table_end: