Well, there is a flaw to fix. (RAW_HEADER.SIZE-1) and (RAW_CODE.SIZE-1), otherwise SECTION_ALIGNMENT can be larger than needed by 1 if the code.size is exactly equal to SECTION_ALIGNMENT. (which is likely if the code is near that size, due to alignment padding.)
Also, as to format, I'm showing next how to split the section information so that, for larger projects, sub modules can be %included easily...
[MAP ALL exetest6.map] ;; use this to generate a MAP file of useful information.
; exetest.asm
SECTIONS equ 2
TIME_DATE equ 0
IMAGE_BASE equ 0x400000
SECTION_ALIGNMENT equ 0x1000
FILE_ALIGNMENT equ 0x200
BSS_SIZE equ 0
%define nagoa_round(size) ((size + SECTION_ALIGNMENT - 1) & ~(SECTION_ALIGNMENT - 1))
bits 32
org IMAGE_BASE
section .text
;;******************************************************************************************************
;; if the header is part of the image, define it as section .text because .text is put
;; first in the image, and rename the code section as section .code
header:
dw "MZ" ; e_magic
dw 0 ; e_cblp
dw 0 ; e_cp
dw 0 ; e_crlc
dw 0 ; e_cparhdr
dw 0 ; e_minalloc
dw 0 ; e_maxalloc
dw 0 ; e_ss
dw 0 ; e_sp
dw 0 ; e_csum
dw 0 ; e_ip
dw 0 ; e_cs
dw 0 ; e_lsarlc
dw 0 ; e_ovno
dq 0 ; e_res
dw 0 ; e_oemid
dw 0 ; e_oeminfo
dd 0,0,0,0,0 ; e_res2
dd imageHeader - IMAGE_BASE ; e_lfanew
imageHeader:
dd "PE" ; Signature
dw 0x014C ; Machine
dw SECTIONS ; NumberOfSections
dd TIME_DATE ; TimeDateStamp
dd 0 ; PointerToSymbolTable
dd 0 ; NumberOfSymbols
dw optionalHeader.SIZE ; SizeOfOptionalHeader
dw 0x0303 ; Characteristics
optionalHeader:
dw 0x10B ; Magic
db 0 ; MajorLinkerVersion
db 0 ; MinorLinkerVersion
dd nagoa_round(RAW_CODE.SIZE) ; SizeOfCode
dd nagoa_round(RAW_DATA.SIZE) ; SizeOfInitializedData
dd nagoa_round(BSS_SIZE) ; SizeOfUninitializedData
dd entryPoint - IMAGE_BASE ; AddressOfEntryPoint
dd code - IMAGE_BASE ; BaseOfCode
dd data - IMAGE_BASE ; BaseOfData
dd IMAGE_BASE ; ImageBase
dd SECTION_ALIGNMENT ; SectionAlignment
dd FILE_ALIGNMENT ; FileAlignment
dw 4 ; MajorOperatingSystemVersion
dw 0 ; MinorOperatingSystemVersion
dw 0 ; MajorImageVersion
dw 0 ; MinorImageVersion
dw 4 ; MajorSubsystemVersion
dw 0 ; MinorSubsystemVersion
dd 0 ; Win32VersionValue
;; dd IMAGE_END - IMAGE_BASE ; SizeOfImage
dd (RAW_HEADER.SIZE + RAW_CODE.SIZE + RAW_DATA.SIZE)
dd RAW_HEADER.SIZE ; SizeOfHeaders
dd 0 ; CheckSum
dw 2 ; Subsystem
dw 0 ; DllCharacteristics
dd 0x40000 ; SizeOfStackReserve
dd 0x6000 ; SizeOfStackCommit
dd 0x100000 ; SizeOfHeapReserve
dd 0x1000 ; SizeOfHeapCommit
dd 0 ; LoaderFlags
dd 16 ; NumberOfRvaAndSizes
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_EXPORT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_IMPORT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_RESOURCE
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_EXCEPTION
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_SECURITY
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_BASERELOC
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_DEBUG
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_COPYRIGHT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_GLOBALPTR
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_TLS
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_IAT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
dd 0, 0 ; reserved
optionalHeader.SIZE equ $ - optionalHeader
sectionHeaders:
db ".text", 0, 0, 0 ; Name
dd nagoa_round(RAW_CODE.SIZE) ; VirtualSize
dd code ; VirtualAddress
dd RAW_CODE.SIZE ; SizeOfRawData
dd RAW_CODE.OFFSET ; PointerToRawData
dd 0 ; PointerToRelocations
dd 0 ; PointerToLinenumbers
dw 0 ; NumberOfRelocations
dw 0 ; NumberOfLinenumbers
dd 0x60000020 ; Characteristics
db ".data", 0, 0, 0 ; Name
dd nagoa_round(RAW_DATA.SIZE) ; VirtualSize
dd data ; VirtualAddress
dd RAW_DATA.SIZE ; SizeOfRawData
dd RAW_DATA.OFFSET ; PointerToRawData
dd 0 ; PointerToRelocations
dd 0 ; PointerToLinenumbers
dw 0 ; NumberOfRelocations
dw 0 ; NumberOfLinenumbers
dd 0xC0000040 ; Characteristics
align FILE_ALIGNMENT, db 0
RAW_HEADER.SIZE equ $ - header
;;******************************************************************************************************
;; F I R S T . c o d e S E C T I O N
;;******************************************************************************************************
VS_CODE EQU ( IMAGE_BASE + ( ( 1 + ( (RAW_HEADER.SIZE-1) >> 12 ) ) * SECTION_ALIGNMENT ) )
section .code vstart=VS_CODE
code:
entryPoint:
xor eax, eax
ret
TIMES 1000h db 90h ;; nop
;;******************************************************************************************************
;; F I R S T . d a t a S E C T I O N
;;******************************************************************************************************
VS_DATA EQU ( VS_CODE + ( ( 1 + ( (RAW_CODE.SIZE-1) >> 12 ) ) * SECTION_ALIGNMENT ) )
section .data vstart=VS_DATA
data:
db "An unused string"
;;******************************************************************************************************
;; I N C L U D E S U B R O U T I N E F I L E S
;;******************************************************************************************************
%INCLUDE "sbr0.sbr"
%INCLUDE "sbr1.sbr"
;;******************************************************************************************************
;; L A S T . c o d e S E C T I O N
;;******************************************************************************************************
section .code
align FILE_ALIGNMENT, db 0
RAW_CODE.OFFSET equ RAW_HEADER.SIZE
RAW_CODE.SIZE equ $ - $$
;;******************************************************************************************************
;; L A S T . d a t a S E C T I O N
;;******************************************************************************************************
section .data
align FILE_ALIGNMENT, db 0
RAW_DATA.OFFSET equ RAW_CODE.OFFSET + RAW_CODE.SIZE
RAW_DATA.SIZE equ $ - $$
;;******************************************************************************************************
IMAGE_END equ $
;; -- eof --
..with the example include files..
;; file sbr0.sbr
SECTION .code
TIMES 220h db 0CCh
SECTION .data
TIMES 210h db 'put some strings'
;; eo sbr0.sbr
and
;; file sbr1.sbr
SECTION .code
TIMES 230h db 090h
SECTION .data
TIMES 240h db 'put more strings'
;; eo sbr1.sbr
You will find the section calculations are still maintained this way, and the included files need not do anything special.
My question for you is: what does PE do for a stack? I see that the header gives some info, so the PE loader must manage the stack from the information given, dynamically, and so the programmer need not manage it. -correct?
If you could go into more detail about what else you are after, with examples of what you need to do, I (and others) may have some ideas.
hth,
Steve