Skip to content

Instantly share code, notes, and snippets.

@depp
Created April 9, 2019 16:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save depp/83bfcaa8e29a42fc6691f2f8bd30c313 to your computer and use it in GitHub Desktop.
Save depp/83bfcaa8e29a42fc6691f2f8bd30c313 to your computer and use it in GitHub Desktop.
32-bit Hello World for DOS with DOS/32A
;; 32-bit Hello World
;; This creates a Linear Executable which can be run with DOS/32A.
;; See: http://dos32a.narechk.net/index_en.html
;;
;; To compile,
;; nasm -o hello32.exe -f bin hello32.asm
;; To run,
;; dos32a hello32
;; Screenshot: https://imgur.com/EiaU2py
bits 32
cpu 386
;; =============================================================================
;; Header
;; =============================================================================
section .header
;; 0000
db 'L', 'E', 0, 0 ; signature, little endian
dd 0 ; format level
dw 2 ; 386 or higher
dw 1 ; target OS: OS/2
dd 0 ; module version
;; 0010
dd 0 ; module type (OS/2 junk?)
dd 2 ; number of pages
dd 1 ; EIP object number
dd 0 ; EIP address
;; 0020
dd 2 ; ESP object number
dd 0x1000 ; ESP address
dd 0x1000 ; Page size, 4 KiB
dd end - start ; Bytes on last page (LE, different for LX)
;; 0030
; Fixup section size
dd fixup_end - fixup_start
dd 0 ; Fixup section checksum
; Loader section size
dd loader_end - loader_start
dd 0 ; Loader section checksum
;; 0040
dd object_table ; Object table offset
dd 2 ; Number of objects
dd page_table ; Object page table offset
dd 0 ; Object iter pages offset
;; 0050
dd 0 ; Resource table offset
dd 0 ; Number of resource table entries
dd 0 ; Resident name table offset
dd 0 ; Entry table offset
;; 0060
dd 0 ; Module directives offset
dd 0 ; Number of module directives
dd fixup_page ; Fixup page table offset
dd fixup_record ; Fixup record table offset
;; 0070
dd fixup_end ; Import module table offset
dd 0 ; Number of import module entries
dd 0 ; Import proc table offset
dd 0 ; Per-page checksum table offset
;; 0080
; Data pages offset
dd section..text.start
dd 0 ; Number of preload pages
dd 0 ; Non-resident name table offset
dd 0 ; Non-resident name table length
;; 0090
dd 0 ; Non-resident name table checksum
dd 1 ; Auto DS object number
dd 0 ; Debug information offset
dd 0 ; Debug information length
;; 00A0
dd 0 ; Number of instance preload
dd 0 ; Number of instance on-demand
dd 0 ; Heapsize (16-bit only)
;; =====================================
;; Loader section
;; =====================================
loader_start:
object_table:
;; Text object
dd 0x1000 ; size
dd 0x10000 ; reloc base addr
dd 0x2005 ; flags (RX + 32-bit)
dd 1 ; page table index
dd 1 ; page table count
dd 0 ; reserved
;; Stack object
dd 0x1000 ; size
dd 0x20000 ; reloc base addr
dd 0x2003 ; flags (RW + 32-bit)
dd 2 ; page table index
dd 1 ; page table count
dd 0 ; reserved
page_table:
;; These appear to be correspond to pages in the object table above, and contain
;; one-based indexes into the fixup page table. Note that the indexes are
;; big-endian at offset 1! This was confirmed with experimentation.
db 0, 0, 1, 0
db 0, 0, 2, 0
db 0, 0, 3, 0
loader_end:
;; =====================================
;; Fixup section
;; =====================================
fixup_start:
fixup_page:
dd 0
dd fixup_record.page1 - fixup_record
dd fixup_record.page2 - fixup_record
fixup_record:
db 0x07 ; Source: 32-bit offset
db 0x00 ; Target: internal reference
; Source offset
; This is a bit of a hack, unfortunately. Ideally, our assembler would
; emit the relocations for us, but NASM does not support this binary
; format.
dw 1
db 1 ; Target object
; Target offset
dw hellostr - start
.page1:
.page2:
fixup_end:
;; =============================================================================
;; Code
;; =============================================================================
section .text follows=.header vstart=0x10000
start:
mov edx, hellostr
mov ah, 0x09
int 0x21
mov ax, 0x4c00
int 0x21
hellostr:
db `Hello, 32-bit World!\r\n$`
end:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment