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
 |