-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathelements.h
More file actions
205 lines (141 loc) · 4.15 KB
/
Copy pathelements.h
File metadata and controls
205 lines (141 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#ifndef ELEMENTS_H
#define ELEMENTS_H
#include "memory.h"
#include <cassert>
// Class representing variable identifier which can contain any characters,
// provided that its length is between 1 to 10 including.
class Identifier {
public:
explicit Identifier(const char *id);
const char * get_id() const;
private:
const char * const _id;
bool is_valid() const;
};
class RValue {
public:
RValue() = default;
virtual ~RValue() = default;
virtual const word_t *evaluate(Memory *memory) const = 0;
};
using RVal_ptr = std::shared_ptr<RValue>;
class LValue : public RValue {
public:
LValue() = default;
virtual ~LValue() = default;
virtual const word_t *evaluate(Memory *memory) const = 0;
};
using LVal_ptr = std::shared_ptr<LValue>;
// Class representing integer numeric literal.
class Num : public RValue {
public:
explicit Num(word_t val);
~Num() = default;
const word_t *evaluate([[maybe_unused]] Memory *memory) const override;
private:
const word_t _val;
};
using Num_ptr = std::shared_ptr<Num>;
// Class enabling to get effective address of variable with given identifier.
class Lea : public RValue {
public:
explicit Lea(Identifier id);
~Lea() = default;
const word_t *evaluate(Memory *memory) const override;
private:
const Identifier _id;
};
// Class enabling to get access to computer memory cell under given address.
class Mem : public LValue {
public:
explicit Mem(RVal_ptr addr);
~Mem() = default;
const word_t *evaluate(Memory *memory) const override;
private:
const RVal_ptr _addr;
};
class Instruction {
public:
Instruction() = default;
virtual ~Instruction() = default;
virtual void execute(Memory *memory) = 0;
virtual void init(Memory *memory) = 0;
};
using Instr_ptr = std::shared_ptr<Instruction>;
// Class enabling declaration of variable.
class Declaration : public Instruction {
public:
Declaration(Identifier id, Num_ptr val);
~Declaration() = default;
void execute(Memory *memory) override;
void init(Memory *memory) override;
private:
const Identifier _id;
const Num_ptr _val;
};
class Operation : public Instruction {
public:
Operation(LVal_ptr arg1, RVal_ptr arg2);
virtual ~Operation() = default;
virtual void execute(Memory *memory) = 0;
void init(Memory *memory) override;
protected:
const LVal_ptr _arg1;
const RVal_ptr _arg2;
void set_flags(word_t val, Memory *memory);
};
// Class enabling operation of copying value from source [arg1]
// to destination [arg2].
class Mov : public Operation {
public:
Mov(LVal_ptr arg1, RVal_ptr arg2);
~Mov() = default;
void execute(Memory *memory) override;
};
// Class enabling addition of value evaluated from [arg2] to element stored
// in [arg2]. After arithmetic operation depending on result
// sets processor flags.
class Add : public Operation {
public:
Add(LVal_ptr arg1, RVal_ptr arg2);
~Add() = default;
void execute(Memory *memory) override;
};
// Class enabling subtraction of value evaluated from [arg2] to element stored
// in [arg2]. After arithmetic operation depending on result
// sets processor flags.
class Sub : public Operation {
public:
Sub(LVal_ptr arg1, RVal_ptr arg2);
~Sub() = default;
void execute(Memory *memory) override;
};
class Assignment : public Instruction {
public:
explicit Assignment(LVal_ptr arg);
virtual void execute(Memory *memory) = 0;
void init(Memory *memory) override;
protected:
const LVal_ptr _arg;
};
// Class enabling to set value under address evaluated from [arg] value 1.
class One : public Assignment {
public:
explicit One(LVal_ptr arg);
void execute(Memory *memory) override;
};
// Class enabling to set value under address evaluated from [arg] value 1,
// in case ZF is equal 1.
class Onez : public Assignment {
public:
explicit Onez(LVal_ptr arg);
void execute(Memory *memory) override;
};
// Class enabling to set value under address evaluated from [arg] value 1,
// in case SF is equal 1.
class Ones : public Assignment {
public:
explicit Ones(LVal_ptr arg);
void execute(Memory *memory) override;
};
#endif /* ELEMENTS_H */