| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Sat, 01 Nov 2025 04:59:23 +0000 | |
| changeset 1021 | 5990e03b2ba8 | 
| parent 991 | b4b97704815b | 
| permissions | -rw-r--r-- | 
| 630 | 1  | 
% !TEX program = xelatex  | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
2  | 
\documentclass{article}
 | 
| 
309
 
640e4a05cd9b
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
298 
diff
changeset
 | 
3  | 
\usepackage{../style}
 | 
| 
216
 
f5ec7c597c5b
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
214 
diff
changeset
 | 
4  | 
\usepackage{../langs}
 | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
5  | 
|
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
6  | 
\begin{document}
 | 
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
7  | 
|
| 
354
 
86b2aeae3e98
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
333 
diff
changeset
 | 
8  | 
%https://github.com/Storyyeller/Krakatau  | 
| 
 
86b2aeae3e98
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
333 
diff
changeset
 | 
9  | 
%https://docs.oracle.com/javase/specs/jvms/se7/html/  | 
| 
 
86b2aeae3e98
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
333 
diff
changeset
 | 
10  | 
|
| 706 | 11  | 
% Jasmin Tutorial  | 
12  | 
%http://saksagan.ceng.metu.edu.tr/courses/ceng444/link/jvm-cpm.html  | 
|
13  | 
||
| 751 | 14  | 
\section*{Coursework 4}
 | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
15  | 
|
| 836 | 16  | 
\noindent This coursework is worth 15\% and is due on \cwFOUR{}
 | 
| 877 | 17  | 
at 16:00. You are asked to implement a compiler for  | 
| 
309
 
640e4a05cd9b
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
298 
diff
changeset
 | 
18  | 
the WHILE language that targets the assembler language  | 
| 823 | 19  | 
provided by Jasmin or Krakatau (both have a very similar  | 
| 973 | 20  | 
syntax). You can do the implementation in any programming  | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
21  | 
language you like, but you need to submit the source code with  | 
| 985 | 22  | 
which you answered the tasks, otherwise a mark of 0\% will  | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
23  | 
be awarded. You should use the lexer and parser from the  | 
| 951 | 24  | 
previous courseworks. Implement your compiler in the file \texttt{cw04.sc}.
 | 
| 920 | 25  | 
|
26  | 
%Please package \emph{everything}(!) in
 | 
|
27  | 
%a zip-file that creates a directory with the name  | 
|
28  | 
%\texttt{YournameYourFamilyname} on my end.
 | 
|
| 
358
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
29  | 
|
| 751 | 30  | 
\subsection*{Disclaimer\alert}
 | 
| 
358
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
31  | 
|
| 
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
32  | 
It should be understood that the work you submit represents  | 
| 
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
33  | 
your own effort. You have not copied from anyone else. An  | 
| 
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
34  | 
exception is the Scala code I showed during the lectures,  | 
| 991 | 35  | 
which you can use. You can also use your own code from  | 
36  | 
CW~1, CW~2 and CW~3.  | 
|
37  | 
%But do not  | 
|
38  | 
%be tempted to ask Github Copilot for help or do any other  | 
|
39  | 
%shenanigans like this!  | 
|
| 
358
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
40  | 
|
| 
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
41  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
42  | 
\subsection*{Jasmin Assembler}
 | 
| 
358
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
43  | 
|
| 950 | 44  | 
For this coursework you will need an assembler.  | 
| 
358
 
b3129cff41e9
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
354 
diff
changeset
 | 
45  | 
The Jasmin assembler is available from  | 
| 
201
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
46  | 
|
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
47  | 
\begin{center}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
48  | 
\url{http://jasmin.sourceforge.net}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
49  | 
\end{center}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
50  | 
|
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
51  | 
\noindent  | 
| 991 | 52  | 
This jar-file is also included in your template files for CW 4.  | 
53  | 
You can run it on the command line with \texttt{java -jar jasmin}.
 | 
|
| 
201
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
54  | 
There is a user guide for Jasmin  | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
55  | 
|
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
56  | 
\begin{center}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
57  | 
\url{http://jasmin.sourceforge.net/guide.html}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
58  | 
\end{center}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
59  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
60  | 
\noindent and also a description of some of the instructions  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
61  | 
that the JVM understands  | 
| 
201
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
62  | 
|
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
63  | 
\begin{center}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
64  | 
\url{http://jasmin.sourceforge.net/instructions.html}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
65  | 
\end{center}
 | 
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
66  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
67  | 
\noindent If you generated a correct assembler file for  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
68  | 
Jasmin, for example \texttt{loops.j}, you can use
 | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
69  | 
|
| 
205
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
70  | 
\begin{center}
 | 
| 950 | 71  | 
\texttt{java -jar jasmin.jar loops.j}
 | 
| 
205
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
72  | 
\end{center}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
73  | 
|
| 991 | 74  | 
\noindent in order to translate it into Java Byte Code. If relevant, you  | 
| 852 | 75  | 
need to give the path to the Jasmin jar-file. The resulting class  | 
76  | 
file can be run with  | 
|
| 
205
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
77  | 
|
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
78  | 
\begin{center}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
79  | 
\texttt{java loops}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
80  | 
\end{center}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
81  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
82  | 
\noindent where you might need to give the correct path to the  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
83  | 
class file. For example:  | 
| 
322
 
698ed1c96cd0
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
321 
diff
changeset
 | 
84  | 
|
| 
 
698ed1c96cd0
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
321 
diff
changeset
 | 
85  | 
\begin{center}
 | 
| 
 
698ed1c96cd0
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
321 
diff
changeset
 | 
86  | 
\texttt{java -cp . loops/loops}
 | 
| 
 
698ed1c96cd0
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
321 
diff
changeset
 | 
87  | 
\end{center}
 | 
| 
 
698ed1c96cd0
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
321 
diff
changeset
 | 
88  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
89  | 
\noindent There are also other resources about Jasmin on the  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
90  | 
Internet, for example  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
91  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
92  | 
\begin{center}
 | 
| 836 | 93  | 
\small\url{https://saksagan.ceng.metu.edu.tr/courses/ceng444/link/f3jasmintutorial.html}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
94  | 
\end{center}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
95  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
96  | 
\noindent and  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
97  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
98  | 
\begin{center}
 | 
| 991 | 99  | 
  \small\url{https://urbanchr.github.io/cfl/JVM.pdf}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
100  | 
\end{center}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
101  | 
|
| 950 | 102  | 
\noindent  | 
| 991 | 103  | 
The latter is courtesy of Tom Way.  | 
| 950 | 104  | 
If possible use Jasmin for the coursework. The Krakatau assembler  | 
| 973 | 105  | 
below has a slightly different syntax.  | 
| 950 | 106  | 
|
107  | 
||
| 
958
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
108  | 
\subsection*{Krakatau Assembler (Version 1 \& 2)}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
109  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
110  | 
The Krakatau assembler is available from  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
111  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
112  | 
\begin{center}
 | 
| 950 | 113  | 
  \url{https://github.com/Storyyeller/Krakatau/tree/master}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
114  | 
\end{center}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
115  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
116  | 
\noindent This assembler requires Python and a package called  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
117  | 
\pcode{ply} available from
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
118  | 
|
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
119  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
120  | 
\url{https://pypi.python.org/pypi/ply}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
121  | 
\end{center}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
122  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
123  | 
\noindent This assembler is largely compatible with the Jasmin  | 
| 
958
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
124  | 
syntax---that means for the files we are concerned with here, it  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
125  | 
understands the same input syntax (no changes to your compiler need to  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
126  | 
be made; ok maybe some small syntactic adjustments are needed, for  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
127  | 
example labels need to start with a capital '\texttt{L}'). You can generate Java
 | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
128  | 
Byte Code by using  | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
129  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
130  | 
\begin{center}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
131  | 
\texttt{python Krakatau-master/assemble.py loops.j}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
132  | 
\end{center}
 | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
133  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
134  | 
\noindent where you may have to adapt the directory where  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
135  | 
Krakatau is installed (I just downloaded the zip file from  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
136  | 
Github and \pcode{Krakatau-master} was the directory where it
 | 
| 473 | 137  | 
was installed). Again the resulting class-file you can run with  | 
| 950 | 138  | 
\texttt{java}. There is also a newer version of Krakatau available at
 | 
139  | 
||
140  | 
\begin{center}
 | 
|
141  | 
\url{https://github.com/Storyyeller/Krakatau/tree/v2}
 | 
|
142  | 
\end{center}
 | 
|
143  | 
||
144  | 
\noindent  | 
|
145  | 
This is now a Rust program using Cargo as package manager (I have not tried this  | 
|
146  | 
version---I assume it should produce the same output, but might be  | 
|
147  | 
easier to install because it avoids Python's \emph{dependency hell}).
 | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
148  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
149  | 
|
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
150  | 
%\noindent You need to submit a document containing the answers  | 
| 985 | 151  | 
%for the two tasks below. You can do the implementation in  | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
152  | 
%any programming language you like, but you need to submit the  | 
| 985 | 153  | 
%source code with which you answered the tasks. Otherwise  | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
154  | 
%the submission will not be counted. However, the coursework  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
155  | 
%will \emph{only} be judged according to the answers. You can
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
156  | 
%submit your answers in a txt-file or as pdf.\bigskip  | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
157  | 
|
| 985 | 158  | 
%\subsection*{Task 0 (Unmarked)}
 | 
| 920 | 159  | 
%  | 
160  | 
%Please include in the PDF at the beginning your email address, your student  | 
|
161  | 
%number and whether you are BSc / MSci student and for the latter in which  | 
|
162  | 
%year your are in. Thanks!  | 
|
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
163  | 
|
| 985 | 164  | 
\subsection*{Task 1}
 | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
165  | 
|
| 
958
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
166  | 
You need to lex and parse WHILE programs, and then generate Java Byte  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
167  | 
Code instructions for the Jasmin assembler (or Krakatau  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
168  | 
assembler). For this you should use the ASTs defined in CW3 (including  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
169  | 
logical operators). As part of the solution you need to submit the assembler  | 
| 973 | 170  | 
instructions for the Fibonacci and Factorial programs.  | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
171  | 
|
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
172  | 
\begin{figure}[t]
 | 
| 852 | 173  | 
\lstinputlisting[language=while]{../cwtests/cw04/fib.while}
 | 
| 
320
 
0c43ef11e086
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
313 
diff
changeset
 | 
174  | 
\caption{The Fibonacci program in the WHILE language.\label{fibs}}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
175  | 
\end{figure}
 | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
176  | 
|
| 985 | 177  | 
\subsection*{Task 2}
 | 
| 
201
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
178  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
179  | 
Extend the syntax of your language so that it contains also  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
180  | 
\texttt{for}-loops, like
 | 
| 
201
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
181  | 
|
| 
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
182  | 
\begin{center}
 | 
| 
391
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
183  | 
\lstset{language=While}
 | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
184  | 
\code{for} \;\textit{Id} \texttt{:=} \textit{AExp}\; \code{upto} 
 | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
185  | 
\;\textit{AExp}\; \code{do} \textit{Block} 
 | 
| 
201
 
c813506e0ee8
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
200 
diff
changeset
 | 
186  | 
\end{center}
 | 
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
187  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
188  | 
\noindent The intended meaning is to first assign the variable  | 
| 950 | 189  | 
\textit{Id} the value of the first arithmetic expression, then test
 | 
| 598 | 190  | 
whether this value is less or equal than the value of the  | 
| 
391
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
191  | 
second arithmetic expression. If yes, go through the loop, and  | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
192  | 
at the end increase the value of the loop variable by 1 and  | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
193  | 
start again with the test. If no, leave the loop. For example  | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
194  | 
the following instance of a \code{for}-loop is supposed to
 | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
195  | 
print out the numbers \pcode{2}, \pcode{3}, \pcode{4}.
 | 
| 
202
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
196  | 
|
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
197  | 
|
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
198  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
199  | 
\begin{minipage}{12cm}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
200  | 
\begin{lstlisting}[language=While, numbers=none]
 | 
| 
202
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
201  | 
for i := 2 upto 4 do {
 | 
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
202  | 
write i  | 
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
203  | 
}  | 
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
204  | 
\end{lstlisting}
 | 
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
205  | 
\end{minipage}
 | 
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
206  | 
\end{center}
 | 
| 
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
207  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
208  | 
\noindent There are two ways how this can be implemented: one  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
209  | 
is to adapt the code generation part of the compiler and  | 
| 
391
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
210  | 
generate specific code for \code{for}-loops; the other is to
 | 
| 
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
211  | 
translate the abstract syntax tree of \code{for}-loops into
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
212  | 
an abstract syntax tree using existing language constructs.  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
213  | 
For example the loop above could be translated to the  | 
| 
391
 
f352cb238c32
updated meaning of for-loop
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
390 
diff
changeset
 | 
214  | 
following \code{while}-loop:
 | 
| 
203
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
215  | 
|
| 
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
216  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
217  | 
\begin{minipage}{12cm}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
218  | 
\begin{lstlisting}[language=While, numbers=none]
 | 
| 
203
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
219  | 
i := 2;  | 
| 
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
220  | 
while (i <= 4) do {
 | 
| 
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
221  | 
write i;  | 
| 905 | 222  | 
i := i + 1  | 
| 
203
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
223  | 
}  | 
| 
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
224  | 
\end{lstlisting}
 | 
| 
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
225  | 
\end{minipage}
 | 
| 
 
f1335c171d50
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
202 
diff
changeset
 | 
226  | 
\end{center}
 | 
| 
202
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
227  | 
|
| 985 | 228  | 
\subsection*{Task 3 (OPTIONAL)}
 | 
| 
333
 
8890852e18b7
updated coursework
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
328 
diff
changeset
 | 
229  | 
|
| 985 | 230  | 
\noindent In this task you are asked to think about the following  | 
| 973 | 231  | 
program:  | 
| 
205
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
232  | 
|
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
233  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
234  | 
\begin{minipage}{12cm}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
235  | 
\begin{lstlisting}[language=While, numbers=none]
 | 
| 
333
 
8890852e18b7
updated coursework
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
328 
diff
changeset
 | 
236  | 
for i := 1 upto 10 do {
 | 
| 
 
8890852e18b7
updated coursework
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
328 
diff
changeset
 | 
237  | 
  for i := 1 upto 10 do {
 | 
| 
 
8890852e18b7
updated coursework
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
328 
diff
changeset
 | 
238  | 
write i  | 
| 
205
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
239  | 
}  | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
240  | 
}  | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
241  | 
\end{lstlisting}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
242  | 
\end{minipage}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
243  | 
\end{center}
 | 
| 
 
0b59588d28d2
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
204 
diff
changeset
 | 
244  | 
|
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
245  | 
\noindent  | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
246  | 
Note that in this program the variable \pcode{i} is used
 | 
| 973 | 247  | 
twice. Therefore you need to make a decision about how it should be compiled?  | 
248  | 
What should the program print?  | 
|
| 
202
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
249  | 
|
| 985 | 250  | 
\subsection*{Task 4}
 | 
| 920 | 251  | 
|
| 942 | 252  | 
Extend the lexer and parser to add a \textcolor{codepurple}{\pcode{break}} keyword.  Modify
 | 
253  | 
the compiler (including lexer and parser) such that when a \textcolor{codepurple}{\texttt{break}}-statement is encountered
 | 
|
| 
958
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
254  | 
the code should jump out of the ``enclosing'' for/while-loop, or in case it  | 
| 
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
255  | 
is not inside such a loop to the end of the program. For example the  | 
| 920 | 256  | 
program  | 
257  | 
||
258  | 
\begin{center}
 | 
|
259  | 
\begin{minipage}{12cm}
 | 
|
260  | 
\begin{lstlisting}[language=While, numbers=none]
 | 
|
| 942 | 261  | 
// should print 0 .. 10  | 
| 920 | 262  | 
for i := 0 upto 10 do {
 | 
263  | 
write i;  | 
|
264  | 
write "\n"  | 
|
265  | 
};  | 
|
| 910 | 266  | 
|
| 942 | 267  | 
// should print 0 .. 4  | 
| 920 | 268  | 
for i := 0 upto 10 do {
 | 
269  | 
if i > 4 then break else skip;  | 
|
270  | 
write i;  | 
|
271  | 
write "\n"  | 
|
272  | 
};  | 
|
| 910 | 273  | 
|
| 920 | 274  | 
write "Should print\n";  | 
275  | 
break;  | 
|
276  | 
write "Should not print\n"  | 
|
277  | 
\end{lstlisting}
 | 
|
278  | 
\end{minipage}
 | 
|
279  | 
\end{center}
 | 
|
280  | 
||
281  | 
\noindent  | 
|
| 950 | 282  | 
should print out 0 to 10 with the first for-loop, but only 0  | 
| 920 | 283  | 
to 4 in the second. Similarly it should print out \code{"Should print"},
 | 
284  | 
but not \code{"Should not print"}. For this you need to add
 | 
|
| 
958
 
6caee1c0222e
updated and added pascal.while file
 
Christian Urban <christian.urban@kcl.ac.uk> 
parents: 
951 
diff
changeset
 | 
285  | 
a label to the end of every for- and while-loop and also to the end of the  | 
| 920 | 286  | 
whole program just in case you need to jump to that label via a  | 
| 985 | 287  | 
\code{break}. The file you need to be able to process for this task
 | 
| 951 | 288  | 
is called \texttt{break.while}.
 | 
| 920 | 289  | 
|
| 910 | 290  | 
|
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
291  | 
\subsection*{Further Information}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
292  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
293  | 
The Java infrastructure unfortunately does not contain an  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
294  | 
assembler out-of-the-box (therefore you need to download the  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
295  | 
additional package Jasmin or Krakatau---see above). But it  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
296  | 
does contain a disassembler, called \texttt{javap}. A
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
297  | 
dissembler does the ``opposite'' of an assembler: it generates  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
298  | 
readable assembler code from Java Byte Code. Have a look at  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
299  | 
the following example: Compile using the usual Java compiler  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
300  | 
the simple Hello World program below:  | 
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
301  | 
|
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
302  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
303  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
304  | 
\begin{lstlisting}[language=Java,numbers=none]
 | 
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
305  | 
class HelloWorld {
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
306  | 
    public static void main(String[] args) {
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
307  | 
        System.out.println("Hello World!");
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
308  | 
}  | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
309  | 
}  | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
310  | 
\end{lstlisting}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
311  | 
\end{minipage}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
312  | 
\end{center}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
313  | 
|
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
314  | 
\noindent  | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
315  | 
You can use the command  | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
316  | 
|
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
317  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
318  | 
\begin{minipage}{12cm}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
319  | 
\begin{lstlisting}[language={},numbers=none]
 | 
| 950 | 320  | 
javap -c HelloWorld  | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
321  | 
\end{lstlisting}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
322  | 
\end{minipage}
 | 
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
323  | 
\end{center}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
324  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
325  | 
\noindent to see the assembler instructions of the Java Byte  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
326  | 
Code that has been generated for this program. You can compare  | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
327  | 
this with the code generated for the Scala version of Hello  | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
328  | 
World.  | 
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
329  | 
|
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
330  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
331  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
332  | 
\begin{lstlisting}[language=Scala,numbers=none]
 | 
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
333  | 
object HelloWorld {
 | 
| 950 | 334  | 
   def main(args: Array[String]) = {
 | 
| 
204
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
335  | 
      println("Hello World!")
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
336  | 
}  | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
337  | 
}  | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
338  | 
\end{lstlisting}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
339  | 
\end{minipage}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
340  | 
\end{center}
 | 
| 
 
fec99c437965
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
203 
diff
changeset
 | 
341  | 
|
| 
222
 
b712519b41d3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
216 
diff
changeset
 | 
342  | 
|
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
343  | 
\subsection*{Library Functions}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
344  | 
|
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
345  | 
You need to generate code for the commands \texttt{write} and
 | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
346  | 
\texttt{read}. This will require the addition of some
 | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
347  | 
``library'' functions to your generated code. The first  | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
348  | 
command even needs two versions, because you need to write out  | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
349  | 
an integer and string. The Java byte code will need two  | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
350  | 
separate functions for this. For writing out an integer, you  | 
| 
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
351  | 
can use the assembler code  | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
352  | 
|
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
353  | 
\begin{center}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
354  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
355  | 
\begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
356  | 
.method public static write(I)V  | 
| 859 | 357  | 
.limit locals 1  | 
358  | 
.limit stack 2  | 
|
359  | 
getstatic java/lang/System/out Ljava/io/PrintStream;  | 
|
360  | 
iload 0  | 
|
361  | 
invokevirtual java/io/PrintStream/println(I)V  | 
|
362  | 
return  | 
|
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
363  | 
.end method  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
364  | 
\end{lstlisting}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
365  | 
\end{minipage}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
366  | 
\end{center}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
367  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
368  | 
\noindent This function will invoke Java's \texttt{println}
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
369  | 
function for integers. Then if you need to generate code for  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
370  | 
\texttt{write x} where \texttt{x} is an integer variable, you
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
371  | 
can generate  | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
372  | 
|
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
373  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
374  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
375  | 
\begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
376  | 
iload n  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
377  | 
invokestatic XXX/XXX/write(I)V  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
378  | 
\end{lstlisting}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
379  | 
\end{minipage}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
380  | 
\end{center}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
381  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
382  | 
\noindent where \texttt{n} is the index where the value of the
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
383  | 
variable \texttt{x} is stored. The \texttt{XXX/XXX} needs to
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
384  | 
be replaced with the class name which you use to generate the  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
385  | 
code (for example \texttt{fib/fib} in case of the Fibonacci
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
386  | 
numbers).  | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
387  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
388  | 
Writing out a string is similar. The corresponding library  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
389  | 
function uses strings instead of integers:  | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
390  | 
|
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
391  | 
\begin{center}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
392  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
393  | 
\begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
394  | 
.method public static writes(Ljava/lang/String;)V  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
395  | 
.limit stack 2  | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
396  | 
.limit locals 1  | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
397  | 
getstatic java/lang/System/out Ljava/io/PrintStream;  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
398  | 
aload 0  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
399  | 
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
400  | 
return  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
401  | 
.end method  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
402  | 
\end{lstlisting}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
403  | 
\end{minipage}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
404  | 
\end{center}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
405  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
406  | 
\noindent The code that needs to be generated for \code{write
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
407  | 
"some_string"} commands is  | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
408  | 
|
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
409  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
410  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
411  | 
\begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 
210
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
412  | 
ldc "some_string"  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
413  | 
invokestatic XXX/XXX/writes(Ljava/lang/String;)V  | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
414  | 
\end{lstlisting}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
415  | 
\end{minipage}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
416  | 
\end{center}
 | 
| 
 
33175abd5474
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
205 
diff
changeset
 | 
417  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
418  | 
\noindent Again you need to adjust the \texttt{XXX/XXX} part
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
419  | 
in each call.  | 
| 
202
 
180cbfc1520a
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
201 
diff
changeset
 | 
420  | 
|
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
421  | 
The code for \texttt{read} is more complicated. The reason is
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
422  | 
that inputting a string will need to be transformed into an  | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
423  | 
integer. The code in Figure~\ref{read} does this. It can be
 | 
| 
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
424  | 
called with  | 
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
425  | 
|
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
426  | 
\begin{center}
 | 
| 
390
 
a1fe591a3df3
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
373 
diff
changeset
 | 
427  | 
\begin{minipage}{12cm}
 | 
| 
313
 
90ccc385c547
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
309 
diff
changeset
 | 
428  | 
\begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
429  | 
invokestatic XXX/XXX/read()I  | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
430  | 
istore n  | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
431  | 
\end{lstlisting}
 | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
432  | 
\end{minipage}
 | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
433  | 
\end{center}
 | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
434  | 
|
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
435  | 
\noindent  | 
| 950 | 436  | 
where \texttt{n} is the index of the variable that requires an input.
 | 
437  | 
%If you  | 
|
438  | 
%use Windows you need to take into account that a ``return'' is not just a newline,  | 
|
439  | 
%\code{'\\10'}, but \code{'\\13\\10'}. This means you need to change line~12 in 
 | 
|
440  | 
%Figure~\ref{read} to \pcode{ldc 13}.  
 | 
|
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
441  | 
|
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
442  | 
|
| 
321
 
c5850f8f3f5e
updated
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
320 
diff
changeset
 | 
443  | 
\begin{figure}[t]\small
 | 
| 540 | 444  | 
\begin{lstlisting}[language=JVMIS,numbers=left]
 | 
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
445  | 
.method public static read()I  | 
| 859 | 446  | 
.limit locals 10  | 
447  | 
.limit stack 10  | 
|
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
448  | 
|
| 859 | 449  | 
ldc 0  | 
450  | 
istore 1 ; this will hold our final integer  | 
|
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
451  | 
Label1:  | 
| 859 | 452  | 
getstatic java/lang/System/in Ljava/io/InputStream;  | 
453  | 
invokevirtual java/io/InputStream/read()I  | 
|
454  | 
istore 2  | 
|
455  | 
iload 2  | 
|
| 950 | 456  | 
ldc 10 ; test for the newline delimiter for Unix  | 
| 859 | 457  | 
isub  | 
| 950 | 458  | 
ifeq Label2  | 
459  | 
iload 2  | 
|
460  | 
ldc 13 ; test for the carriage-return in Windows  | 
|
461  | 
isub  | 
|
462  | 
ifeq Label2  | 
|
| 859 | 463  | 
iload 2  | 
464  | 
ldc 32 ; the space delimiter  | 
|
465  | 
isub  | 
|
466  | 
ifeq Label2  | 
|
467  | 
iload 2  | 
|
468  | 
ldc 48 ; we have our digit in ASCII, have to subtract it from 48  | 
|
469  | 
isub  | 
|
470  | 
ldc 10  | 
|
471  | 
iload 1  | 
|
472  | 
imul  | 
|
473  | 
iadd  | 
|
474  | 
istore 1  | 
|
475  | 
goto Label1  | 
|
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
476  | 
Label2:  | 
| 859 | 477  | 
; when we come here we have our integer computed  | 
478  | 
; in local variable 1  | 
|
479  | 
iload 1  | 
|
480  | 
ireturn  | 
|
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
481  | 
.end method  | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
482  | 
\end{lstlisting}\normalsize
 | 
| 950 | 483  | 
\caption{Assembler code for reading an integer from the console.
 | 
484  | 
This code is portable for Unix and Windows (see Lines 11--18 for 2 separate  | 
|
485  | 
tests for the various end-of-line markers). Thanks to Harry  | 
|
486  | 
  Dilnot to make it portable.\label{read}}
 | 
|
| 
214
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
487  | 
\end{figure}
 | 
| 
 
5be68de225e9
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents: 
213 
diff
changeset
 | 
488  | 
|
| 
200
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
489  | 
\end{document}
 | 
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
490  | 
|
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
491  | 
%%% Local Variables:  | 
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
492  | 
%%% mode: latex  | 
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
493  | 
%%% TeX-master: t  | 
| 
 
7415871b1ef5
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
494  | 
%%% End:  |