Created
April 9, 2019 16:10
-
-
Save depp/83bfcaa8e29a42fc6691f2f8bd30c313 to your computer and use it in GitHub Desktop.
32-bit Hello World for DOS with DOS/32A
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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