Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // lab2.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <vector>
- #include <map>
- #include <fstream>
- #include <sstream>
- #include <conio.h>
- #include <iomanip>
- #include <stack>
- #include <algorithm>
- using namespace std;
- string /*R1 = "000000000000000000000000", S = "000000000000000000000000", */IR; //S - акумулятор
- int PC, TC;
- bool PS;
- stack<string> ANS;
- void ShiftLeft(int n);
- /*
- 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 < 24 ; ++i)
- s[i]= s[i]=='1'?'0':'1';
- return s;
- }
- string Add(string s1, string s2){
- bool m=0;
- string ans = "000000000000000000000000";
- for(int i = 23 ; 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 Xor(string s1, string s2){
- string ans = "000000000000000000000000";
- for(int i = 23 ; i>=0 ; --i)
- if(s1[i]!=s2[i]) ans[i] = '1';
- else ans[i] = '0';
- return ans;
- }
- string Complement(string s){
- return(Add(Reverse(s),"000000000000000000000001"));
- }
- /*
- string BitR(string &s){
- for(int i = 23 ; i ; --i)
- s[i] = s[i-1];
- s[0] = '0';
- return s;
- }
- string BitL(string &s){
- for(int i = 0 ; i < 23 ; ++i)
- s[i] = s[i+1];
- s[23] = '0';
- return s;
- }*/
- string DecToBin(int n , int bit = 24){
- string ans = "";
- if(n>=0){
- while(n != 0){
- ans = ((n % 2)?"1":"0") + ans;
- n/=2;
- }
- while(ans.length()<bit)
- ans = "0" + ans;
- }else
- ans = Complement(DecToBin(abs(n)));
- return ans;
- }
- void Status(){
- cout << "IR = " << IR << endl;
- // cout << "R1 = ";
- // for(int i = 1 ; i <=24 ; ++i)
- // cout << R1[i-1] << (i % 4 ? "":" ");
- cout << "Stack: " << endl;
- stack<string> tmp;
- for(; ANS.size() ;){
- cout << setw(7) << " ";
- for(int i = 1 ; i <=24 ; ++i)
- cout << ANS.top()[i-1] << (i % 4 ? "":" ");
- cout << endl;
- tmp.push(ANS.top());
- ANS.pop();
- }
- for(; tmp.size() ;){
- ANS.push(tmp.top());
- tmp.pop();
- }
- /*cout << endl;
- cout << "S = ";
- for(int i = 1 ; i <=24 ; ++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;
- // S = DecToBin(n);
- ANS.push(DecToBin(n));
- // S[16] = PS?'1':'0';
- TC = 2;
- Status();
- }
- void XorB(int n){
- ++PC;
- TC = 1;
- Status();
- PS = n < 0;
- // cout << n << endl;
- // R1 = DecToBin(n);// cout << ((S[16]=='0' && PS) || (S[16]=='1' && !PS)) << endl;
- if((ANS.top()[0]=='0' && PS) || (ANS.top()[0]=='1' && !PS)) PS = 1; else PS = 0;
- // S = Xor(ANS.top(),DecToBin(n));
- ANS.push(Xor(ANS.top(),DecToBin(n)));
- TC = 2;
- Status();
- }
- /*
- void ShiftRight(int n){
- if(n<0){
- ShiftLeft(-n);
- return;
- }
- ++PC;
- TC = 1;
- Status();
- PS = 0;
- R1 = DecToBin(n);
- for(string p = R1 ; p != "000000000000000000000000" ; p = Add(p,"111111111111111111111111"))
- BitR(S);
- if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
- TC = 2;
- Status();
- }*/
- /*
- void ShiftLeft(int n){
- if(n<0){
- ShiftRight(-n);
- return;
- }
- ++PC;
- TC = 1;
- Status();
- PS = 0;
- R1 = DecToBin(n);
- for(string p = R1 ; p != "000000000000000000000000" ; p = Add(p,"111111111111111111111111"))
- BitL(S);
- if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 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) == "000000000000000000000000") 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) == "000000000000000000000000") 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 "000000000000000000000000";
- }*/
- /*
- void Mod(int n){
- ++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;
- Status();
- }*/
- void Case(string q , bool flag){
- ++PC;
- TC = 1;
- Status();
- if(flag) transform(q.begin() , q.end() , q.begin() , toupper);
- else transform(q.begin() , q.end() , q.begin() , tolower);
- string t;
- for(int i = 0 ; i < 3 && i < q.length() ; ++i){
- t += DecToBin((int)q[i] , 8).substr(0,8);
- }
- ANS.push(t);
- PS = t[0] == '1';
- TC = 2;
- Status();
- }
- int main()
- {
- ifstream file("C:\\Users\\Max\\Documents\\Visual Studio 2010\\Projects\\lab2\\Release\\input.txt");
- while(file){
- string s , q;
- int n;
- file >> s;
- q = "";
- if(s =="Case") file >> q;
- file >> n;
- IR = s + " " + q + (q!=""?" ":"") + NtS<int>(n);
- if(s == "Load")
- Load(n);
- else if(s == "Xor")
- XorB(n);
- /* else if(s == "Stl")
- ShiftLeft(n);
- else if(s == "Str")
- ShiftRight(n);
- else if(s == "Mod")
- Mod(n);*/
- else if(s == "Case")
- Case(q , n);
- if(file)system("Pause");
- cout << endl;
- }
- /////////////////////////////
- /* string s = "Load";
- int k = -32767;
- IR = s + " " + NtS<int>(k);
- Load(k);
- s = "Xor";
- k = 9;
- IR = s + " " + NtS<int>(k);
- XorB(k);*/
- /* s = "STL";
- k = 3;
- IR = s + " " + NtS<int>(k);
- ShiftLeft(k);*/
- /* Load(122);
- cout << endl;
- Mod(3) ;*/
- system("Pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement