277 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
.BP
 | 
						|
.AP "AN EXAMPLE PROGRAM"
 | 
						|
.A 1 0
 | 
						|
.NA
 | 
						|
.ta 4n 8n 12n 16n 20n
 | 
						|
.nf
 | 
						|
 1	program example(output);
 | 
						|
 2	{This program just demonstrates typical EM code.}
 | 
						|
 3	type rec = record r1: integer; r2:real; r3: boolean end;
 | 
						|
 4	var mi: integer;  mx:real;  r:rec;
 | 
						|
 5
 | 
						|
 6	function sum(a,b:integer):integer;
 | 
						|
 7	begin
 | 
						|
 8		sum := a + b
 | 
						|
 9	end;
 | 
						|
10
 | 
						|
11	procedure test(var r: rec);
 | 
						|
12	label 1;
 | 
						|
13	var i,j: integer;
 | 
						|
14		x,y: real;
 | 
						|
15		b: boolean;
 | 
						|
16		c: char;
 | 
						|
17		a: array[1..100] of integer;
 | 
						|
18
 | 
						|
19	begin
 | 
						|
20		j := 1;
 | 
						|
21		i := 3 * j + 6;
 | 
						|
22		x := 4.8;
 | 
						|
23		y := x/0.5;
 | 
						|
24		b := true;
 | 
						|
25		c := 'z';
 | 
						|
26		for i:= 1 to 100 do a[i] := i * i;
 | 
						|
27		r.r1 := j+27;
 | 
						|
28		r.r3 := b;
 | 
						|
29		r.r2 := x+y;
 | 
						|
30		i := sum(r.r1, a[j]);
 | 
						|
31		while i > 0 do begin j := j + r.r1; i := i - 1 end;
 | 
						|
32		with r do begin r3 := b;  r2 := x+y;  r1 := 0 end;
 | 
						|
33		goto 1;
 | 
						|
34	1:	writeln(j, i:6, x:9:3, b)
 | 
						|
35	end; {test}
 | 
						|
36	begin {main program}
 | 
						|
37		mx := 15.96;
 | 
						|
38		mi := 99;
 | 
						|
39		test(r)
 | 
						|
40	end.
 | 
						|
.fi
 | 
						|
.AD
 | 
						|
.BP
 | 
						|
The EM code as produced by the Pascal-VU compiler is given below. Comments
 | 
						|
have been added manually.  Note that this code has already been  optimized.
 | 
						|
.A 1 0
 | 
						|
.NA
 | 
						|
.nf
 | 
						|
.ta 1n 24n
 | 
						|
	mes 2,2,2	; wordsize 2, pointersize 2
 | 
						|
\&.1
 | 
						|
	rom 't.p\e000'	; the name of the source file
 | 
						|
	hol 552,\-32768,0	; externals and buf occupy 552 bytes
 | 
						|
	exp $sum	; sum can be called from other modules
 | 
						|
	pro $sum,2	; procedure sum	; 2 bytes local storage
 | 
						|
	lin 8	; code from source line 8
 | 
						|
	ldl 0	; load two locals ( a and b )
 | 
						|
	adi 2	; add them
 | 
						|
	ret 2	; return the result
 | 
						|
	end 2	; end of procedure ( still two bytes local storage )
 | 
						|
\&.2
 | 
						|
	rom 1,99,2	; descriptor of array a[]
 | 
						|
	exp $test	; the compiler exports all level 0 procedures
 | 
						|
	pro $test,226	; procedure test, 226 bytes local storage
 | 
						|
\&.3
 | 
						|
	rom 4.8F8	; assemble Floating point 4.8 (8 bytes) in
 | 
						|
\&.4		; global storage
 | 
						|
	rom 0.5F8	; same for 0.5
 | 
						|
	mes 3,\-226,2,2	; compiler temporary not referenced by address
 | 
						|
	mes 3,\-24,2,0	; the same is true for i, j, b and c in test
 | 
						|
	mes 3,\-22,2,0
 | 
						|
	mes 3,\-4,2,0
 | 
						|
	mes 3,\-2,2,0
 | 
						|
	mes 3,\-20,8,0	; and for x and y
 | 
						|
	mes 3,\-12,8,0
 | 
						|
	lin 20	; maintain source line number
 | 
						|
	loc 1
 | 
						|
	stl \-4	; j := 1
 | 
						|
	lni	; lin 21 prior to optimization
 | 
						|
	lol \-4
 | 
						|
	loc 3
 | 
						|
	mli 2
 | 
						|
	loc 6
 | 
						|
	adi 2
 | 
						|
	stl \-2	; i := 3 * j + 6
 | 
						|
	lni	; lin 22 prior to optimization
 | 
						|
	lae .3
 | 
						|
	loi 8
 | 
						|
	lal \-12
 | 
						|
	sti 8	; x := 4.8
 | 
						|
	lni	; lin 23 prior to optimization
 | 
						|
	lal \-12
 | 
						|
	loi 8
 | 
						|
	lae .4
 | 
						|
	loi 8
 | 
						|
	dvf 8
 | 
						|
	lal \-20
 | 
						|
	sti 8	; y := x / 0.5
 | 
						|
	lni	; lin 24 prior to optimization
 | 
						|
	loc 1
 | 
						|
	stl \-22	; b := true
 | 
						|
	lni	; lin 25 prior to optimization
 | 
						|
	loc 122
 | 
						|
	stl \-24	; c := 'z'
 | 
						|
	lni	; lin 26 prior to optimization
 | 
						|
	loc 1
 | 
						|
	stl \-2	; for i:= 1
 | 
						|
2
 | 
						|
	lol \-2
 | 
						|
	dup 2
 | 
						|
	mli 2	; i*i
 | 
						|
	lal \-224
 | 
						|
	lol \-2
 | 
						|
	lae .2
 | 
						|
	sar 2	; a[i] :=
 | 
						|
	lol \-2
 | 
						|
	loc 100
 | 
						|
	beq *3	; to 100 do
 | 
						|
	inl \-2	; increment i and loop
 | 
						|
	bra *2
 | 
						|
3
 | 
						|
	lin 27
 | 
						|
	lol \-4
 | 
						|
	loc 27
 | 
						|
	adi 2	; j + 27
 | 
						|
	sil 0	; r.r1 :=
 | 
						|
	lni	; lin 28 prior to optimization
 | 
						|
	lol \-22	; b
 | 
						|
	lol 0
 | 
						|
	stf 10	; r.r3 :=
 | 
						|
	lni	; lin 29 prior to optimization
 | 
						|
	lal \-20
 | 
						|
	loi 16
 | 
						|
	adf 8	; x + y
 | 
						|
	lol 0
 | 
						|
	adp 2
 | 
						|
	sti 8	; r.r2 :=
 | 
						|
	lni	; lin 23 prior to optimization
 | 
						|
	lal \-224
 | 
						|
	lol \-4
 | 
						|
	lae .2
 | 
						|
	lar 2	; a[j]
 | 
						|
	lil 0	; r.r1
 | 
						|
	cal $sum	; call now
 | 
						|
	asp 4	; remove parameters from stack
 | 
						|
	lfr 2	; get function result
 | 
						|
	stl \-2	; i :=
 | 
						|
4
 | 
						|
	lin 31
 | 
						|
	lol \-2
 | 
						|
	zle *5	; while i > 0 do
 | 
						|
	lol \-4
 | 
						|
	lil 0
 | 
						|
	adi 2
 | 
						|
	stl \-4	; j := j + r.r1
 | 
						|
	del \-2	; i := i - 1
 | 
						|
	bra *4	; loop
 | 
						|
5
 | 
						|
	lin 32
 | 
						|
	lol 0
 | 
						|
	stl \-226	; make copy of address of r
 | 
						|
	lol \-22
 | 
						|
	lol \-226
 | 
						|
	stf 10	; r3 := b
 | 
						|
	lal \-20
 | 
						|
	loi 16
 | 
						|
	adf 8
 | 
						|
	lol \-226
 | 
						|
	adp 2
 | 
						|
	sti 8	; r2 := x + y
 | 
						|
	loc 0
 | 
						|
	sil \-226	; r1 := 0
 | 
						|
	lin 34	; note the abscence of the unnecesary jump
 | 
						|
	lae 22	; address of output structure
 | 
						|
	lol \-4
 | 
						|
	cal $_wri	; write integer with default width
 | 
						|
	asp 4	; pop parameters
 | 
						|
	lae 22
 | 
						|
	lol \-2
 | 
						|
	loc 6
 | 
						|
	cal $_wsi	; write integer width 6
 | 
						|
	asp 6
 | 
						|
	lae 22
 | 
						|
	lal \-12
 | 
						|
	loi 8
 | 
						|
	loc 9
 | 
						|
	loc 3
 | 
						|
	cal $_wrf	; write fixed format real, width 9, precision 3
 | 
						|
	asp 14
 | 
						|
	lae 22
 | 
						|
	lol \-22
 | 
						|
	cal $_wrb	; write boolean, default width
 | 
						|
	asp 4
 | 
						|
	lae 22
 | 
						|
	cal $_wln	; writeln
 | 
						|
	asp 2
 | 
						|
	ret 0	; return, no result
 | 
						|
	end 226
 | 
						|
	exp $_main
 | 
						|
	pro $_main,0	; main program
 | 
						|
\&.6
 | 
						|
	con 2,\-1,22	; description of external files
 | 
						|
\&.5
 | 
						|
	rom 15.96F8
 | 
						|
	fil .1	; maintain source file name
 | 
						|
	lae .6	; description of external files
 | 
						|
	lae 0	; base of hol area to relocate buffer addresses
 | 
						|
	cal $_ini	; initialize files, etc...
 | 
						|
	asp 4
 | 
						|
	lin 37
 | 
						|
	lae .5
 | 
						|
	loi 8
 | 
						|
	lae 2
 | 
						|
	sti 8	; mx := 15.96
 | 
						|
	lni	; lin 38 prior to optimization
 | 
						|
	loc 99
 | 
						|
	ste 0	; mi := 99
 | 
						|
	lni	; lin 39 prior to optimization
 | 
						|
	lae 10	; address of r
 | 
						|
	cal $test
 | 
						|
	asp 2
 | 
						|
	loc 0	; normal exit
 | 
						|
	cal $_hlt	; cleanup and finish
 | 
						|
	asp 2
 | 
						|
	end 0
 | 
						|
	mes 5	; reals were used
 | 
						|
.fi
 | 
						|
.AD
 | 
						|
.A 1 0
 | 
						|
The compact code corresponding to the above program is listed below.
 | 
						|
Read it horizontally, line by line, not column by column.
 | 
						|
Each number represents a byte of compact code, printed in decimal.
 | 
						|
The first two bytes form the magic word.
 | 
						|
.N 1
 | 
						|
.IS 3
 | 
						|
.Dr 33
 | 
						|
 173   0 159 122 122 122 255 242   1 161 250 124 116  46 112   0
 | 
						|
 255 156 245  40   2 245   0 128 120 155 249 123 115 117 109 160
 | 
						|
 249 123 115 117 109 122  67 128  63 120   3 122  88 122 152 122
 | 
						|
 242   2 161 121 219 122 255 155 249 124 116 101 115 116 160 249
 | 
						|
 124 116 101 115 116 245 226   0 242   3 161 253 128 123  52  46
 | 
						|
  56 255 242   4 161 253 128 123  48  46  53 255 159 123 245  30
 | 
						|
 255 122 122 255 159 123  96 122 120 255 159 123  98 122 120 255
 | 
						|
 159 123 116 122 120 255 159 123 118 122 120 255 159 123 100 128
 | 
						|
 120 255 159 123 108 128 120 255  67 140  69 121 113 116  68  73
 | 
						|
 116  69 123  81 122  69 126   3 122 113 118  68  57 242   3  72
 | 
						|
 128  58 108 112 128  68  58 108  72 128  57 242   4  72 128  44
 | 
						|
 128  58 100 112 128  68  69 121 113  98  68  69 245 122   0 113
 | 
						|
  96  68  69 121 113 118 182  73 118  42 122  81 122  58 245  32
 | 
						|
 255  73 118  57 242   2  94 122  73 118  69 220  10 123  54 118
 | 
						|
  18 122 183  67 147  73 116  69 147   3 122 104 120  68  73  98
 | 
						|
  73 120 111 130  68  58 100  72 136   2 128  73 120   4 122 112
 | 
						|
 128  68  58 245  32 255  73 116  57 242   2  59 122  65 120  20
 | 
						|
 249 123 115 117 109   8 124  64 122 113 118 184  67 151  73 118
 | 
						|
 128 125  73 116  65 120   3 122 113 116  41 118  18 124 185  67
 | 
						|
 152  73 120 113 245  30 255  73  98  73 245  30 255 111 130  58
 | 
						|
 100  72 136   2 128  73 245  30 255   4 122 112 128  69 120 104
 | 
						|
 245  30 255  67 154  57 142  73 116  20 249 124  95 119 114 105
 | 
						|
   8 124  57 142  73 118  69 126  20 249 124  95 119 115 105   8
 | 
						|
 126  57 142  58 108  72 128  69 129  69 123  20 249 124  95 119
 | 
						|
 114 102   8 134  57 142  73  98  20 249 124  95 119 114  98   8
 | 
						|
 124  57 142  20 249 124  95 119 108 110   8 122  88 120 152 245
 | 
						|
 226   0 155 249 125  95 109  97 105 110 160 249 125  95 109  97
 | 
						|
 105 110 120 242   6 151 122 119 142 255 242   5 161 253 128 125
 | 
						|
  49  53  46  57  54 255  50 242   1  57 242   6  57 120  20 249
 | 
						|
 124  95 105 110 105   8 124  67 157  57 242   5  72 128  57 122
 | 
						|
 112 128  68  69 219 110 120  68  57 130  20 249 124 116 101 115
 | 
						|
 116   8 122  69 120  20 249 124  95 104 108 116   8 122 152 120
 | 
						|
 159 124 160 255 159 125 255
 | 
						|
.De
 | 
						|
.IE
 |