1; -*- nasm -*- 2; NASM macro file to allow the `bin' output format to generate 3; simple .EXE files by constructing the EXE header by hand. 4; Adapted from a contribution by Yann Guidon <whygee_corp@hol.fr> 5 6%define EXE_stack_size EXE_realstacksize 7 8%macro EXE_begin 0 9 ORG 0E0h 10 section .text 11 12header_start: 13 db 4Dh,5Ah ; EXE file signature 14 dw EXE_allocsize % 512 15 dw (EXE_allocsize + 511) / 512 16 dw 0 ; relocation information: none 17 dw (header_end-header_start)/16 ; header size in paragraphs 18 dw (EXE_absssize + EXE_realstacksize) / 16 ; min extra mem 19 dw (EXE_absssize + EXE_realstacksize) / 16 ; max extra mem 20 dw -10h ; Initial SS (before fixup) 21 dw EXE_endbss + EXE_realstacksize ; Initial SP (1K DPMI+1K STACK) 22 dw 0 ; (no) Checksum 23 dw 100h ; Initial IP - start just after the header 24 dw -10h ; Initial CS (before fixup) 25 dw 0 ; file offset to relocation table: none 26 dw 0 ; (no overlay) 27 align 16,db 0 28header_end: 29 30EXE_startcode: 31 section .data 32EXE_startdata: 33 section .bss 34EXE_startbss: 35%endmacro 36 37%macro EXE_stack 1 38EXE_realstacksize equ %1 39%define EXE_stack_size EXE_bogusstacksize ; defeat EQU in EXE_end 40%endmacro 41 42%macro EXE_end 0 43 section .text 44EXE_endcode: 45 section .data 46EXE_enddata: 47 section .bss 48 alignb 4 49EXE_endbss: 50 51EXE_acodesize equ (EXE_endcode-EXE_startcode+3) & (~3) 52EXE_datasize equ EXE_enddata-EXE_startdata 53EXE_absssize equ (EXE_endbss-EXE_startbss+3) & (~3) 54EXE_allocsize equ EXE_acodesize + EXE_datasize 55 56EXE_stack_size equ 0x800 ; default if nothing else was used 57%endmacro 58