Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // lab2_down.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- //INPUT EXAMPLE
- //Load 0 5
- //Load 1 5
- //Mod 1 3
- //Cnt 1 10 1
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <vector>
- #include <map>
- #include <fstream>
- #include <sstream>
- #include <conio.h>
- using namespace std;
- #define NUL "00000000000000000000"
- #define ONE "00000000000000000001"
- #define M_ONE "11111111111111111111"
- string R1 = NUL, S = NUL, IR; //S - акумулятор
- int PC, TC;
- bool PS;
- bool flag = 0;
- /*
- IR - регістр команди, містить текстовий запис команди, яка є поточною;
- R1 - перший регістр;
- PS - регістр статусу, може містити лише знак останнього результату (в R2 значення -1, тому в PS мінус);
- PC - регістр лічильника команд (зараз виконується 7-ма команда);
- TC - регістр лічильника тактів (зараз виконався 2-й такт).
- Якщо має бути одноадресна модель команд, то ще потрібний регістр, який називають акумулятор.
- В командах він явно операндом не задається, хоча використовується як реальний операнд.
- Типово для команд із акумулятором-операндом є зберігати результат команди саме в акумуляторі.
- */
- template <typename T>
- string NtS(T Number){
- ostringstream ss;
- ss << Number;
- return ss.str();
- }
- string Reverse(string s){
- for(int i = 0 ; i < 20 ; ++i)
- s[i]= s[i]=='1'?'0':'1';
- return s;
- }
- string Add(string s1, string s2){
- bool m=0;
- string ans = NUL;
- for(int i = 19 ; i>=0 ; --i){
- if(s1[i]=='0' && s2[i]=='0'){ ans[i] = m?'1':'0'; m = 0;}else
- if(s1[i]!=s2[i]){ ans[i] = m?'0':'1'; m = m?1:0;}else
- if(s1[i]=='1' && s2[i]=='1'){ ans[i] = m?'1':'0'; m = 1;}
- }
- return ans;
- }
- string Complement(string s){
- return(Add(Reverse(s),ONE));
- }
- string DecToBin(int n){
- string ans = "";
- if(n>=0){
- while(n != 0){
- ans = ((n % 2)?"1":"0") + ans;
- n/=2;
- }
- while(ans.length()<20)
- ans = "0" + ans;
- }else
- ans = Complement(DecToBin(abs(n)));
- return ans;
- }
- void Status(){
- cout << "IR = " << IR << endl;
- cout << "R1 = ";
- for(int i = 1 ; i <=20 ; ++i)
- cout << R1[i-1] << (i % 4 ? "":" ");
- cout << endl;
- cout << "R2 = ";
- for(int i = 1 ; i <=20 ; ++i)
- cout << S[i-1] << (i % 4 ? "":" ");
- cout << endl << endl;
- cout << "PC = " << PC << endl;
- cout << "TC = " << TC << endl;
- cout << "PS = " << PS << endl;
- cout << endl << endl;
- }
- void Load(int n){
- ++PC;
- TC = 1;
- Status();
- PS = n < 0;
- if(flag)
- S = DecToBin(n);
- else
- R1 = DecToBin(n);
- // S[16] = PS?'1':'0';
- TC = 2;
- Status();
- }
- string GetMod(int n){
- if(S[0]=='0'){
- R1 = DecToBin(n);
- n = -abs(n);
- string t = DecToBin(n);
- string t1 = S;
- for(;;){
- if(Add(S,t) == NUL) return Add(S,t);
- if(Add(S,t)[0] == '1') return t1;
- t1 = Add(S,t);
- S = Add(S,t);
- //cout << t1 << endl; system("Pause");
- }
- }else{
- R1 = DecToBin(n);
- n = abs(n);
- string t = DecToBin(n);
- string t1 = S;
- for(;;){
- if(Add(S,t) == NUL) return Add(S,t);
- if(Add(S,t)[0] == '0') return t1;
- t1 = Add(S,t);
- S = Add(S,t);
- //cout << t1 << endl; system("Pause");
- }
- }
- return NUL;
- }
- void Mod(int n){
- if(!flag)swap(S , R1);
- ++PC;
- TC = 1;
- Status();
- PS = 0;
- S = GetMod(n);
- if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
- TC = 2;
- if(!flag)swap(S , R1);
- Status();
- }
- void Cnt(int n , bool n1){
- ++PC;
- TC = 1;
- Status();
- PS = 0;
- string t = DecToBin(n);
- int ans = 0;
- for(int i = 0 ; i < t.length() ; ++i) ans += t[i] == '1';
- if(flag){
- S = DecToBin(n1 ? ans : t.length() - ans);
- R1 = t;
- if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
- }else{
- R1 = DecToBin(n1 ? ans : t.length() - ans);
- S = t;
- if((R1[0]=='0' && PS) || (R1[0]=='1' && !PS)) PS = 1; else PS = 0;
- }
- TC = 2;
- Status();
- }
- int main()
- {
- ifstream file("C:\\Users\\Max\\Documents\\Visual Studio 2010\\Projects\\lab2_down\\lab2_down\\input.txt");
- while(file){
- string s;
- int n , n1;
- file >> s >> flag >> n;
- if(s == "Cnt") file >> n1;
- IR = s + " " + NtS<int>(n);
- if(s == "Load")
- Load(n);
- else if(s == "Mod")
- Mod(n);
- else if(s == "Cnt")
- Cnt(n , n1);
- if(file)system("Pause");
- cout << endl;
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement