source: branches/mini/src/win32k/test/mini.asm

Last change on this file was 6568, checked in by bird, 24 years ago

Documented it.

File size: 10.7 KB
Line 
1; $Id: mini.asm,v 1.1.2.12 2001-08-20 18:47:53 bird Exp $
2;
3; Having great fun making small executables...
4;
5; Copyright (c) 2001 knut st. osmundsen (kosmunds@csc.com)
6;
7; Project Odin Software License can be found in LICENSE.TXT
8;
9
10
11ifdef NORMAL ;
12;
13;
14;
15; High-octane stock.
16;
17; Build this in the Odin32 VAC3 environment to get a 273 bytes result.
18; Exehdr, alp and ilink is required.
19; nmake -f mini.mak NORMAL=1 -a
20;
21; Build this in the Odin32 Watcom environment to get a 274 bytes result.
22; Exehdr, alp and wlink is required.
23; nmake -f mini.mak NORMAL=1 -a
24;
25;
26 .386
27
28; config
29CLIB EQU 1
30
31ifdef CLIB
32extrn vprintf:PROC ; optlink, 2+ parameters. second NULL.
33else
34extrn DosPutMessage:PROC ; system, tree parameters.
35endif
36
37
38CODE32 segment byte stack use32 'STACK'
39public minilx
40
41;
42; Data
43;
44ImReallySmall db "I'm really small!",0ah
45ifdef CLIB
46terminator db 0
47endif
48
49;
50; Code
51;
52minilx:
53ifdef CLIB
54 ; method 1 - 4 bytes
55 ;inc eax
56 ;shl eax,16
57 ; method 2 - 4 bytes
58 ;bts eax, 16
59 ; method 3 - 4 bytes
60 ;inc ah
61 ;mul eax
62 ; method 4 - 3 bytes YEAH!!!
63 dec ax
64 inc eax
65 jmp vprintf
66else
67 push offset ImReallySmall
68 push 18
69 push eax
70 call DosPutMessage
71 add esp, 12
72 ret
73endif
74db 1000h-$ dup(?)
75CODE32 ends
76
77
78END minilx
79endif
80
81
82
83ifndef NORMAL
84
85;
86;
87;
88; Tiny edition - Custom category - everything but the code is hardcoded!
89;
90; Build it in an Odin32 VACxx/Watcom environment. ALP and link.exe is required.
91; nmake -f mini.mak
92;
93;
94 .386
95
96
97ALL segment byte public
98
99;
100; Constants
101;
102impmod EQU restab
103;data EQU ImReallySmall
104
105
106;
107; The LX header
108;
109 ;struct e32_exe /* New 32-bit .EXE header */
110 ;{
111lxhdr db 'LX'; unsigned char e32_magic[2]; /* Magic number E32_MAGIC */
112db 0 ; unsigned char e32_border; /* The byte ordering for the .EXE */
113db 0 ; unsigned char e32_worder; /* The word ordering for the .EXE */
114dd 0 ; unsigned long e32_level; /* The EXE format level for now = 0 */
115dw 2 ; unsigned short e32_cpu; /* The CPU type */
116dw 1 ; unsigned short e32_os; /* The OS type */
117
118; We can place the object table here I hope..
119; mpages is addjusted to hold the object flags.
120; reserved is 1 which is no problem it seems.
121;
122; Object table with one entry.
123; Defines a
124;
125;dbg0 db 'objtab' ;struct o32_obj /* Flat .EXE object table entry */
126 ;{
127;objtab dd 11000h ; unsigned long o32_size; /* Object virtual size */
128; dd 10000h ; unsigned long o32_base; /* Object base virtual address */
129; ; unsigned long o32_flags; /* Attribute flags */
130; dd (1h OR 2h OR 2000h OR 10h) ;=2013h
131; dd 1 ; unsigned long o32_pagemap; /* Object page map index */
132; dd 1 ; unsigned long o32_mapsize; /* Number of entries in object page map */
133; dd 0 ; unsigned long o32_reserved; /* Reserved */
134 ;};
135objtab:
136dd 20000h ; unsigned long e32_ver; /* Module version */
137 ; unsigned long e32_mflags; /* Module flags */
138dd 200h OR 00h
139dd 2013h ; unsigned long e32_mpages; /* Module # pages */
140dd 1 ; unsigned long e32_startobj; /* Object # for instruction pointer */
141dd 1 ; unsigned long e32_eip; /* Extended instruction pointer */
142dd 1 ; unsigned long e32_stackobj; /* Object # for stack pointer */
143dd 1000h ; unsigned long e32_esp; /* Extended stack pointer */
144dd 1000h ; unsigned long e32_pagesize; /* .EXE page size */
145dd 0 ; unsigned long e32_pageshift; /* Page alignment shift in .EXE */
146 ; unsigned long e32_fixupsize; /* Fixup section size */
147dd offset fixrecend - offset fixpagetab ; allways used together with _ldrsize.
148
149dd 0 ; unsigned long e32_fixupsum; /* Fixup section checksum */
150 ; unsigned long e32_ldrsize; /* Loader section size */
151dd offset data - offset objtab
152dd 0 ; unsigned long e32_ldrsum; /* Loader section checksum */
153 ; unsigned long e32_objtab; /* Object table offset */
154dd offset objtab
155dd 1 ; unsigned long e32_objcnt; /* Number of objects in module */
156 ; unsigned long e32_objmap; /* Object page map offset */
157dd offset pagetab
158 ; unsigned long e32_itermap; /* Object iterated data map offset */ off=4ch
159dd offset data
160dd 0 ; unsigned long e32_rsrctab; /* Offset of Resource Table */
161dd 0 ; unsigned long e32_rsrccnt; /* Number of resource entries */
162 ; unsigned long e32_restab; /* Offset of resident name table */
163dd offset restab
164dd 0 ; unsigned long e32_enttab; /* Offset of Entry Table */
165dd 0 ; unsigned long e32_dirtab; /* Offset of Module Directive Table */ available
166dd 0 ; unsigned long e32_dircnt; /* Number of module directives */ available
167 ; unsigned long e32_fpagetab; /* Offset of Fixup Page Table */
168dd offset fixpagetab
169 ; unsigned long e32_frectab; /* Offset of Fixup Record Table */
170dd offset fixrec
171 ; unsigned long e32_impmod; /* Offset of Import Module Name Table */
172dd offset impmod
173dd 1 ; unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */
174dd 0 ; unsigned long e32_impproc; /* Offset of Import Procedure Name Table */ off = 78
175;dd offset impproc
176dd 0 ; unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */ available
177 ; unsigned long e32_datapage; /* Offset of Enumerated Data Pages */
178dd offset data
179; redefine these entries as obj tab stuff.
180;red dd 0 ; unsigned long e32_preload; /* Number of preload pages */ available!
181;red dd 0 ; unsigned long e32_nrestab; /* Offset of Non-resident Names Table */ available?
182;red dd 0 ; unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */ available?
183;red dd 0 ; unsigned long e32_nressum; /* Non-resident Name Table Checksum */ available?
184;red dd 0 ; unsigned long e32_autodata; /* Object # for automatic data object */ available?
185;red dd 0 ; unsigned long e32_debuginfo; /* Offset of the debugging information */ available?
186
187;
188;red dd 0 ; unsigned long e32_debuglen; /* The length of the debugging info. in bytes */ available?
189;red dd 0 ; unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */ available?
190;red dd 0 ; unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */ available?
191;red dd 0 ; unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */ available?
192
193;mv dd 1000h-32; unsigned long e32_stacksize; /* Size of stack */
194
195;dd 0,0,0,0
196
197;
198; fixup table.
199;
200;dbg2 db 'fixpagetab'
201fixpagetab dd 0 ; offset of fixups for page 1.
202;ntx high 0!dd (offset fixrecend - offset fixrec) ; end of fixup table - needed?
203 dw (offset fixrecend - offset fixrec) ; end of fixup table - needed?
204
205;
206; Page entry for our one page.
207;
208;dbg1 db 'pagetab'
209pagetab dd 0 ; offset 0
210 dw offset dataend - offset data ; data size,
211 dw 0 ; flags. valid
212
213;dw 0
214;dd 1000h-36; unsigned long e32_stacksize; /* Size of stack */
215;dd 20 dup(0); unsigned char e32_res3[E32RESBYTES3]; available!
216 ; /* Pad structure to 196 bytes */
217 ; };
218
219
220;
221; The fixup records.
222;
223; Make one single fixup record which imports the DosPutMessage API.
224; That api have ordinal 5
225; 32-bit offset fixup
226;
227;dbg3 db 'fixrec'
228 ;struct r32_rlc /* Relocation item */
229 ;{
230fixrec db 08h ; unsigned char nr_stype; /* Source type - field shared with new_rlc */
231 ; unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
232db (1h OR 80h) ; imp. ord.; 8 bit ordinal
233 ; short r32_soff; /* Source offset */
234dw (offset fixup - offset data)
235db 1h ; unsigned short r32_objmod; /* Target object number or Module ordinal */
236 ;
237 ; union targetid
238 ; {
239 ; offset intref; /* Internal fixup */
240 ;
241 ; union extfixup
242 ; {
243 ; offset proc; /* Procedure name offset */
244db 5h ; unsigned long ord; /* Procedure odrinal */
245 ; }
246 ; extref; /* External fixup */
247 ;
248 ; struct addfixup
249 ; {
250 ; unsigned short entry; /* Entry ordinal */
251 ; offset addval; /* Value added to the address */
252 ; }
253 ; addfix; /* Additive fixup */
254 ; }
255 ; r32_target; /* Target data */
256 ; unsigned short r32_srccount; /* Number of chained fixup records */
257 ; unsigned short r32_chain; /* Chain head */
258 ;};
259fixrecend:
260
261
262;
263; Imports the MSG dll.
264;
265restab db 3,'MSG' ; now e32_stacksize
266impproc: db 0
267
268
269
270
271assume CS:ALL
272data:
273 int 3
274minilx:
275; int 3
276 push offset ImReallySmall - offset data + 10000h
277 push 18
278 push eax ; 0 or 1 is just the same.
279 ;call DosPutMessage
280 db 0e8h
281fixup dd 0h
282 add esp, 12
283 ret
284ImReallySmall db "I'm really small!",0ah
285
286db 0,0,0
287;lxdump db 'lxdumplxdumplxdumplxdump'
288; db 'lxdumplxdumplxdumplxdump'
289; db 'lxdumplxdumplxdumplxdump'
290dataend:
291
292ALL ENDS
293
294END
295endif
296
297
Note: See TracBrowser for help on using the repository browser.