Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 21
1

Имитация работы микропроцессора

23.12.2016, 11:28. Показов 1468. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, требуется ваша помощь! Дано задание: написать эмулятор микропроцессора с 8 регистрами и набором базовых команд, реализовать в нем цикл FOR.
Сам эмулятор с командами я написал, код будет приведен ниже. Помогите с реализацией цикла FOR.

C++
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
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
 
using namespace std;
 
class CPU {
public:
  int ZF;
  short int* data;
  short int* regs;
  CPU();
  void menu();
  void add(short int*, short int*);
  void sub(short int*, short int*);
  void addval(short int*, short int);
  void neg(short int*, short int);
  void mov(short int*, short int*);
  void write(short int*, short int);
  int getBit(short int, int);
  void printBits(short int*);
};
 
void CPU::add(short int* a, short int* b) {
  cout << "ADD " << *a << " " << *b << "  => " << *a + *b << endl;
  *a += *b;
  *a == 0 ? ZF = 1 : ZF = 0;
}
 
void CPU::addval(short int* a, short int b) {
  *a += b;
  *a == 0 ? ZF = 1 : ZF = 0;
}
 
void CPU::sub(short int* a, short int* b) {
  cout << "SUB " << *a << " " << *b << "  => " << *a - *b << endl;
  *a -= *b;
  *a == 0 ? ZF = 1 : ZF = 0;
}
 
int CPU::getBit(short int a, int bit) {
    while(bit--) {
        a >>= 1;
    }
    return a &= 1;
}
 
void CPU::printBits(short int* a) {
  for (int i = 16; i > -1; i--) {
    cout << getBit(*a, i);
  }
}
 
void CPU::neg(short int* a, short int offs) {
  cout << "NEG " << *a << "("; printBits(a);
  cout << ") " << offs << "  =>";
  short int mask = pow(2, offs);
  *a ^= mask;
  cout << *a << "("; printBits(a); cout << ")" << endl;
}
 
void CPU::mov(short int* a, short int* value) {
  *a = *value;
}
 
void CPU::write(short int* a, short int value) {
  *a = value;
}
 
CPU::CPU() {
  ZF = 0;
  data = new short int[32];
  for (int i = 0; i < 32; i++) {
    data[i] = 0;
  }
  regs = new short int[8];
  for (int i = 0; i < 8; i++) {
    regs[i] = 0;
  }
}
 
void CPU::menu() {
  for (int i = 0; i < 16; i++) {
    cout << setw(2) << i  << " -"<< setw(4) << data[i] << "("; printBits(data + i); cout << "); ";
    cout << setw(2) << i + 16 << " -" << setw(4) << data[i + 16] << "("; printBits(data + i + 16); cout << ");\n";
  }
  cout << endl;
  for (int i = 0; i < 4; i ++) {
    cout << setw(2) << i  << " -" << setw(4) << regs[i] << "("; printBits(regs + i); cout << "); ";
    cout << setw(2) << i + 4 << " -" << setw(4) << regs[i + 4] << "("; printBits(regs + i + 4); cout << ");\n";
  }
  cout << endl << "FLAGS: ZF = " << ZF << ";\n\n";
 
  cout << "0 - ADD  <data_addr1, data_addr2> (write to data_addr1)" << endl;
  cout << "1 - SUB  <data_addr1, data_addr2> (write to data_addr1)" << endl;
  cout << "2 - NEG  <data_addr, offset> (invert bit)" << endl;
  cout << "3 - MOV2REG  <reg_addr, data_addr>" << endl;
  cout << "4 - MOV2DATA  <data_addr, reg_addr>" << endl;
  cout << "5 - WRITE  <data_addr, value>" << endl;
  cout << "6 - GET_BIT  <regs_addr, offset> (print bit)" << endl;
  cout << "7 - CYCFOR" << endl;
 
  char* command = new char [10];
  int a = 0, b = 0, n;
  cin >> command >> a >> b;
  if (!strcmp(command, "ADD")) {
    add(data + a, data + b);
  } else if (!strcmp(command, "SUB")) {
    sub(data + a,data + b);
  } else if (!strcmp(command, "NEG")) {
    neg(data + a, b);
  } else if (!strcmp(command, "MOV2REG")) {
    mov(regs + a, data + b);
  } else if (!strcmp(command, "MOV2DATA")) {
    mov(data + a, regs + b);
  } else if (!strcmp(command, "WRITE")) {
    write(data + a, b);
  } else if (!strcmp(command, "GET_BIT")) {
    cout << "GET_BIT: " << getBit(*(regs + a), b) << endl;
  } else if (!strcmp(command, "CYCFOR")) {
   //for_cycle
}
  }
  cout << "\n\n\n";
  menu();
}
 
int main() {
  CPU cpu;
  cpu.menu();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2016, 11:28
Ответы с готовыми решениями:

Имитация работы станка
Добрый вечер! Прошу помощи в решении следующей задачи. Необходимо симитировать работу такого...

Имитация работы процессора
Составить программу имитирующую работу процессора аккумуляторного типа при переводе прямого кода...

Имитация работы АЗС (ООП)
Задача: написать программу, имитирующая работу АЗС в объектно ориентированном виде. У меня есть...

Имитация работы ЖД
Вопрос наверное риторический, а вдруг... Может существуют подобные устройства? Вот идут капризы,...

10
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 11:43 2
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
написать эмулятор микропроцессора с 8 регистрами
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
Сам эмулятор с командами я написал
А где там восемь регистров?
0
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 21
23.12.2016, 11:59  [ТС] 3
nd2, вот тут у меня выделяется память под 32 слова и регистры
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
CPU::CPU() {
  ZF = 0;
  data = new short int[32];
  for (int i = 0; i < 32; i++) {
    data[i] = 0;
  }
  regs = new short int[8];
  for (int i = 0; i < 8; i++) {
    regs[i] = 0;
  }
}
Добавлено через 9 минут
nd2, или ты имеешь в виду, что я не правильно реализовал это задание?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 12:08 4
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
cin >> command >> a >> b;
И какие значения (a, b) тут можно вводить?
0
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 21
23.12.2016, 12:14  [ТС] 5
nd2, целочисленные. У меня чуть выше описано, какие данные принимает функция.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 12:15 6
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
целочисленные
Это понятно из кода. Величина какая может быть у a и b? Любая допустимая для int ?
0
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 21
23.12.2016, 12:18  [ТС] 7
nd2, short int, до +-14к вроде
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 12:26 8
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
short int, до +-14к
А ничего, что если ввести даже 32, то вот это приведёт к выходу за границу выделеной памяти?
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
data = new short int[32];
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
data + a, data + b
0
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 21
23.12.2016, 12:38  [ТС] 9
nd2, потому, что у меня адресный тип команд, ты вводишь адреса ячеек, а их всего 32
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 12:42 10
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
ты вводишь адреса ячеек, а их всего 32
Я же и спросил:
Цитата Сообщение от nd2 Посмотреть сообщение
Величина какая может быть у a и b?
Ты пишешь:
Цитата Сообщение от Jidkiy Arkadiy Посмотреть сообщение
short int, до +-14к вроде
0
0 / 0 / 1
Регистрация: 12.04.2015
Сообщений: 21
23.12.2016, 12:59  [ТС] 11
nd2, ошибся слегка, бывает.

Добавлено через 4 минуты
UPD
Преподаватель сказал поменять адресный тип команд на регистровый и сделать отдельный список команд через строки(вместо моего else if).
0
23.12.2016, 12:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2016, 12:59
Помогаю со студенческими работами здесь

Имитация работы placeholder
Здравствуйте. Подскажите, почему не работает следующий код, который должен имитировать работу...

Имитация работы парикмахерской
Добрый вечер. Я хочу сделать имитацию работы парикмахерской. Вот с чего начал я : using...

Имитация работы АЗС
Задача: в ООП написать программу, имитирующая работу АЗС. Ограничений никаких нет. /*но желательно...

Имитация работы лидара на Qt
Доброго времени суток! Задача: имитировать работу лидара на Qt. Мое решение: попиксельная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru