The target program produced by the compiler is written in "machine code", and has the
following syntax:
Program = { Directive }.
Directive =
Instruction | "BLOCK" "," Value ";".
Instruction =
InstructionCode "," Value ";" |
InstructionCode =
ADD | SUB | MUL | DIV | LOAD | STORE |
ADDC | SUBC | MULC | DIVC | LOADC |
JUMPEQ | JUMPNE | JUMPLT | JUMPGT | JUMPLE | JUMPGE
JUMP | READ | WRITE | HALT.
Value = Integer.
A program is a directive sequence, each directive being either an "instruction", i.e. machine
command, or a memory allocation directive.
We assume the main store of the machine to consist of cells, each cell
associated with its address, a unique non-negative integer (thus, the cells are
numbered from 1). A cell may hold either an instruction or an integer.
The execution of the program always starts from the first sell.
In addition to the main store, the machine has an accumulator, which is capable of
containing an integer.
A directive
BLOCK,Int;
specifies that at this place in the
program there must be allocated Int store cells containing no instructions.
This directive usually is put at the end of the program, and used for allocating cells that
are to hold the values of the program's variables.
A machine instruction has the form
Op,Value;
where
Op is the instruction's name, and Value the instruction's
operand. The meaning of the operand Value depends on the
instruction's name. Some instructions assume Value to be the address of the
cell. Others assume Value to be an integer. There are instructions, however,
which needn't any operand, in which cases Value must be equal to zero.
An instruction LOAD,Addr; loads the contents of the cell having the address
Addr into the accumulator.
An instruction STORE,Addr; puts the contents of the accumulator into the
cell having the address Addr.
An instruction LOADC,Int; loads the integer Int into the
accumulator.
Instructions ADD, SUB, MUL and
DIV have the form Op,Addr; and compute respectively the sum,
difference, product, and the the truncated quotient of two integers. The first integer is the
one contained by the accumulator, and the second the one contained in the cell having the
address Addr. The result of the operation is put into the accumulator.
Instructions ADDC, SUBC, MULC, and
DIVC have the form Op,Int; and compute respectively the
sum, difference, product, and the truncated quotient of two integers. The first integer is the
one contained in the accumulator, and the second integer is Int, i.e.the one
contained in the operand of the instruction. The result of the operation is put into the
accumulator.
An instruction READ,Addr; reads an integer from the input device and puts it
into the cell having the address Addr.
An instruction WRITE,0; writes the integer contained by the accumulator to
the output device.
An instruction HALT,0; halts the execution of the program.
An instruction JUMP,Addr; causes the control to jump to the instruction
contained in the cell having the address Addr.
And, finally, the last group of instructions comprises the conditional jumps
JUMPEQ, JUMPNE, JUMPLT,
JUMPGT, JUMPLE, and JUMPGE, all having the
form Op,Addr;. They are executed in the following way. First, the contents of
the accumulator is compared with zero. If the condition implied by the instruction's name is
satisfied, the control jumps to the instructions contained in the cell having the address
Addr, otherwise, to the next instruction.
Which condition is tested, is determined by the last two letters in the instruction's name.
EQ means testing the accumulator's contents for being equal to
0, NE for not being equal to 0,
LT for being less than 0, GT for being
greater than 0, LE for being less than or equal to
0, GE for being greater than or equal to 0.
The above program computing the factorial will be translated by the compiler into the
following target program in machine code.
001 READ,21; 008 JUMPGE,16; 015 JUMP,6;
002 LOADC,1; 009 LOAD,19; 016 LOAD,20;
003 STORE,19; 010 ADDC,1; 017 WRITE,0;
004 LOADC,1; 011 STORE,19; 018 HALT,0;
005 STORE,20; 012 LOAD,20; 019 BLOCK,3;
006 LOAD,19; 013 MUL,19;
007 SUB,21; 014 STORE,20;
The address of each directive is shown on the left of the directive.