$24
This project is to be done with Python. In this project, you will implement (i) an assembler and (ii) an execution simulator for a hypothetical CPU called CPU230. CPU230 is illustrated in the following figure:
Each instruction has fixed length of 3 bytes with the following format:
Opcode
Adressing mode
Operand
6 bits
2 bits
16 bits
Addressing mode bits are as follows:
Bits(binary)
Addressing mode
00
operand is immediate data
01
operand is in given in the register
10
operand’s memory address is given in the register
11
operand is a memory address
Note that registers are represented as bit patterns (here given in hex): PC=0000, A=0001, B=0002, C=0003, D=0004, E=0005, S=0006.
Instructions are as follows:
Instruction
Instruction code (hex)
Operand
Meaning
Flags set
HALT
1
Halts the CPU.
LOAD
2
immediate memory
register
Loads operand onto A .
STORE
3
memory
register
Stores value in A to the operand.
ADD
4
immediate memory
register
adds operand to A.
CF,SF, ZF
SUB
5
immediate memory
register
subtracts operand from A.
CF,SF, ZF
INC
6
immediate
increments operand (equivalent to add 1)
SF, ZF, CF
memory
register
DEC
7
immediate memory
register
decrements operand (equivalent to sub 1)
SF, ZF, CF
XOR
8
immediate memory
register
Bitwise XOR operand with A and store result in A.
SF, ZF
AND
9
immediate memory
register
Bitwise AND operand with A and store result in A.
SF, ZF
OR
A
immediate memory
register
Bitwise OR operand with A and store result in A.
SF, ZF
NOT
B
immediate memory
register
Take complement of the bits of the operand.
SF, ZF
SHL
C
register
Shift the bits of register one position to the left.
SF, ZF, CF
SHR
D
register
Shift the bits of register one position to the right.
SF, ZF
NOP
E
No operation.
PUSH
F
register
Push a word sized operand (two bytes) and update S by subtracting 2.
POP
10
register
Pop a word sized data (two bytes) into the operand and update S by adding 2.
CMP
11
immediate memory
register
Perform comparison (AC-operand) and set flag accordingly.
SF, ZF, CF
JMP
12
immediate
Unconditional jump. Set PC to address.
JZ JE
13
immediate
Conditional jump. Jump to address (given as immediate operand) if zero flag is true.
JNZ JNE
14
immediate
Conditional jump. Jump to address (given as immediate operand) if zero flag is false.
JC
15
immediate
Conditional jump. Jump if carry flag is true.
JNC
16
immediate
Conditional jump. Jump if carry flag is false.
JA
17
immediate
Conditional jump. Jump if carry flag is false.
JAE
18
immediate
Conditional jump. Jump if above or equal.
JB
19
immediate
Conditional jump. Jump if below.
JBE
1A
immediate
Conditional jump. Jump if below or equal.
READ
1B
memory
register
Reads a character into the operand.
PRINT
1C
immediate memory
register
Prints the operand as a character.
Note that memory address can be given as [xxxx] or [r] where xxxx is a hexadecimal number or r where r is a register name.
Labels can also be used. A label: marks the address, xxxx, at the point it is defined. Wherever you use a label, you should substitute the marked address xxxx for the label.
The assembler you build will be called cpu230assemble and the execution simulator will be called cpu230exec. They will be used as follows. Suppose you are given a assembly program given in file prog.asm. The following command will assemble the program and produce the binary output prog.bin.
cpu230assemble prog.asm
The following program will execute the binary
cpu230exec prog.bin
The above process is illustrated in the example below:
Assembly source code: prog.asm
Assemble
Assembled program : prog.bin
Execute
Output
LOAD ‘A’
STORE C
LOAD MYDATA
STORE B
LOAD 0004 STORE D
LOOP1:
PRINT C
LOAD C
STORE [B] INC C
INC B
INC B
DEC D
JNZ LOOP1 HALT
MYDATA:
cpu230assemble prog.asm
à
080041
0D0003 08002D
0D0002 080004
0D0004
710003
090003 0E0002 190003 190002
190002 1D0004 530012
040000
cpu230exec prog.bin
à
A
B
C
D
Note also that in the above example, ascii codes of ‘A’, ‘B’, ‘C’, ‘D’ and ‘E’ are stored at the memory addresses 002D, 002F, 0031, 0033, 0035.