Professional Documents
Culture Documents
trữ 1 giá trị gồm 4 chữ số ví du: 0954, 1538,.v.v. truy xuất giá trị bằng cách chỉ mục vị trí
bộ nhớ. Ví dụ: bộ nhớ [3] chứa giá trị được lưu ở vị trí thứ 4 trong bộ nhớ (bắt đầu đếm
từ 0).
3 thanh ghi bao gồm:
một thanh ghi có mục đích chung được gọi là Accumulator (bộ tích lũy)
một thanh ghi thứ cấp để lưu trữ các giá trị tạm thời, được gọi là T
program-counter: lưu trữ vị trí bộ nhớ của lệnh tiếp theo sẽ được thực thi
Xyclotron tuân theo chu trình tìm nạp-giải mã-thực thi để chạy chương trình được lưu
trong bộ nhớ:
Tìm nạp: Máy tính lấy từ bộ nhớ giá trị của từ được lưu trữ tại vị trí được chỉ định bởi bộ
đếm chương trình.
Giải mã: Nó cố gắng diễn giải giá trị dưới dạng lệnh mã máy hợp lệ.
Thực thi: Nếu giải mã thành công, nó sẽ cố gắng thực hiện lệnh và tăng bộ đếm chương
trình (trừ khi lệnh đã sửa đổi rõ ràng bộ đếm chương trình).
Xyclotron có ngôn ngữ mã máy chỉ với 13 lệnh khác nhau. Chúng được mô tả trong bảng
dưới đây:
Khi một từ được lấy từ bộ nhớ, bước giải mã sẽ chia nó thành hai phần bằng nhau. Phần
được biểu thị bằng hai chữ số đầu tiên của từ là mã hoạt động hoặc opcode. Đây là một số
từ 00 đến 99 đại diện cho hướng dẫn cụ thể. Chỉ có 13 mã opcode như trong bảng là hợp
lệ. Hai chữ số cuối cùng biểu thị toán hạng, tức là giá trị mà lệnh sẽ được thực hiện trên
đó.
Ví dụ: nếu vị trí hiện tại trong bộ nhớ chứa từ 1109 thì nó được chia thành opcode = 11
và toán hạng = 09. Vì 11 tương ứng với lệnh SUB nên mục đích của lệnh sẽ là sửa đổi giá
trị hiện tại trong bộ tích lũy, bằng cách trừ đi giá trị được lưu ở vị trí 9 trong bộ nhớ. Vì
vậy, nếu bộ tích lũy chứa giá trị 7 và vị trí bộ nhớ 0009 chứa giá trị 12 thì kết quả của
lệnh là bộ tích lũy sẽ chứa giá trị -5.
Lưu ý rằng T và bộ tích lũy có thể chứa các giá trị âm; tuy nhiên, vị trí bộ nhớ chỉ có thể
lưu trữ số 0 hoặc số nguyên dương.
Cho sẵn Main.cpp và Xyclotron.h
Main.cpp:
#include "Xyclotron.h"
#include <cstring>
int main(int argc, char *argv[]) {
bool trace = (argc > 1 && !strcmp(argv[1], "-trace"));
bool read_and_dump = (argc > 1 && !strcmp(argv[1], "-dump"));
Xyclotron x (trace);
x.read_program();
if (read_and_dump) {
x.memory_dump();
}
x.run_program();
return 0;
}
Xyclotron.h:
#ifndef PRAC3_XYCLOTRON_H
#define PRAC3_XYCLOTRON_H
#include <string>
class Xyclotron {
public:
Xyclotron(bool trace=false);
static std::string trace_format(int command, int accumulator, int
T, int out=-
1) {
return "CMD:" + std::to_string(command)
+ " ACC:" + std::to_string(accumulator)
+ " T:" + std::to_string(T)
+ (out == -1 ? "" : std::to_string(out));
}
int get_accumulator();
int get_T();
void memory_dump();
void read_program();
void run_program();
private:
// INSTRUCTION SET OPCODES
static const int ADD = 10;
static const int SUB = 11;
static const int LOAD = 12;
static const int STORE = 13;
static const int INC = 20;
static const int DEC = 21;
static const int CLEAR = 22;
static const int OUT = 30;
static const int JUMP = 40;
static const int JUMPPOS = 41;
static const int JUMPNEG = 42;
static const int JUMPZERO = 43;
static const int HALT = 99;
static const int SKIP = 0; // 00 - not really used
static std::string opcode_to_mnemonic(int opcode) {
switch(opcode){
case ADD: return "ADD"; break;
case SUB: return "SUB"; break;
case LOAD: return "LOAD"; break;
case STORE: return "STORE"; break;
case INC: return "INC"; break;
case DEC: return "DEC"; break;
case CLEAR: return "CLEAR"; break;
case OUT: return "OUT"; break;
case JUMP: return "JUMP"; break;
case JUMPPOS: return "JUMPPOS"; break;
case JUMPNEG: return "JUMPNEG"; break;
case JUMPZERO: return "JUMPZERO"; break;
case HALT: return "HALT"; break;
case SKIP: return "SKIP"; break;
}
}
static std::string formatted_trace(int mem_address, int opcode, int
operand,
int accumulator_value, int T_value) {
return ">> " + std::to_string(mem_address) + ": " +
std::to_string(opcode) + " [" + opcode_to_mnemonic(opcode) + "] " +
std::to_string(operand) +
"; ACC=" + std::to_string(accumulator_value) +
", T=" + std::to_string(T_value) + " <<";
}
// REGISTERS
int accumulator = 0; // General-purpose computer register
int T = 0; // Register for temporary memory
int program_counter = 0;// the line in the program to execute next
// INTERNAL STORAGE IN THE COMPUTER (how should these arrays be
initialised?)
int memory[100]; // input memory
bool trace = false;
};
#endif //PRAC3_XYCLOTRON_H
viết prime.xyc. Chương trình này lưu trữ một số X trong bộ nhớ và in ra tất cả các số
nguyên tố theo thứ tự nhỏ hơn hoặc bằng X.