Advertisement
osipyonok

Untitled

May 24th, 2016
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.74 KB | None | 0 0
  1. // lab2.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include <vector>
  8. #include <map>
  9. #include <fstream>
  10. #include <sstream>
  11. #include <conio.h>
  12. #include <iomanip>
  13. #include <stack>
  14. #include <algorithm>
  15.  
  16. using namespace std;
  17.  
  18. string /*R1 = "000000000000000000000000", S = "000000000000000000000000", */IR; //S - акумулятор
  19. int PC, TC;
  20. bool PS;
  21. stack<string> ANS;
  22.  
  23. void ShiftLeft(int n);
  24. /*
  25. IR    - регістр команди, містить текстовий запис команди, яка є поточною;
  26. R1    - перший регістр;
  27. PS    - регістр статусу, може містити лише знак останнього результату (в R2 значення -1, тому в PS мінус);
  28. PC    - регістр лічильника команд (зараз виконується 7-ма команда);
  29. TC    - регістр лічильника тактів (зараз виконався 2-й такт).
  30. Якщо має бути одноадресна модель команд, то ще потрібний регістр, який називають акумулятор.
  31. В командах він явно операндом не задається, хоча використовується як реальний операнд.
  32. Типово для команд із акумулятором-опе­рандом є зберігати результат команди саме в акумуляторі.
  33. */
  34.  
  35. template <typename T>
  36. string NtS(T Number){
  37.      ostringstream ss;
  38.      ss << Number;
  39.      return ss.str();
  40. }
  41.  
  42. string Reverse(string s){
  43.     for(int i = 0 ; i < 24 ; ++i)
  44.         s[i]= s[i]=='1'?'0':'1';
  45.     return s;
  46. }
  47.  
  48. string Add(string s1, string s2){
  49.     bool m=0;
  50.     string ans = "000000000000000000000000";
  51.     for(int i = 23 ; i>=0 ; --i){
  52.         if(s1[i]=='0' && s2[i]=='0'){ ans[i] = m?'1':'0'; m = 0;}else
  53.         if(s1[i]!=s2[i]){ ans[i] = m?'0':'1'; m = m?1:0;}else
  54.         if(s1[i]=='1' && s2[i]=='1'){ ans[i] = m?'1':'0'; m = 1;}
  55.     }
  56.     return ans;
  57. }
  58.  
  59.  
  60. string Xor(string s1, string s2){
  61.     string ans = "000000000000000000000000";
  62.     for(int i = 23 ; i>=0 ; --i)
  63.         if(s1[i]!=s2[i]) ans[i] = '1';
  64.         else ans[i] = '0';
  65.     return ans;
  66. }
  67.  
  68. string Complement(string s){
  69.     return(Add(Reverse(s),"000000000000000000000001"));
  70. }
  71. /*
  72. string BitR(string &s){
  73.     for(int i = 23 ; i ; --i)
  74.         s[i] = s[i-1];
  75.     s[0] = '0';
  76.     return s;
  77. }
  78. string BitL(string &s){
  79.     for(int i = 0 ; i < 23 ; ++i)
  80.         s[i] = s[i+1];
  81.     s[23] = '0';
  82.     return s;
  83. }*/
  84.  
  85. string DecToBin(int n , int bit = 24){
  86.     string ans = "";
  87.     if(n>=0){
  88.         while(n != 0){
  89.             ans = ((n % 2)?"1":"0") + ans;
  90.             n/=2;
  91.         }
  92.         while(ans.length()<bit)
  93.             ans = "0" + ans;
  94.     }else
  95.         ans = Complement(DecToBin(abs(n)));
  96.     return ans;
  97. }
  98.  
  99. void Status(){
  100.     cout << "IR = " << IR << endl;
  101. //  cout << "R1 = ";
  102. //  for(int i = 1 ; i <=24 ; ++i)
  103. //      cout << R1[i-1] << (i % 4 ? "":" ");
  104.     cout << "Stack: " << endl;
  105.     stack<string> tmp;
  106.     for(; ANS.size() ;){
  107.         cout << setw(7) << " ";
  108.         for(int i = 1 ; i <=24 ; ++i)
  109.             cout << ANS.top()[i-1] << (i % 4 ? "":" ");
  110.         cout << endl;
  111.         tmp.push(ANS.top());
  112.         ANS.pop();
  113.     }
  114.     for(; tmp.size() ;){
  115.         ANS.push(tmp.top());
  116.         tmp.pop();
  117.     }
  118.     /*cout << endl;
  119.         cout << "S  = ";
  120.     for(int i = 1 ; i <=24 ; ++i)
  121.         cout << S[i-1] << (i % 4 ? "":" ");*/
  122.     cout << endl << endl;
  123.     cout << "PC = " << PC << endl;
  124.     cout << "TC = " << TC << endl;
  125.     cout << "PS = " << PS << endl;
  126.     cout << endl << endl;
  127. }
  128.  
  129. void Load(int n){
  130.     ++PC;
  131.     TC = 1;
  132.     Status();
  133.     PS = n < 0;
  134. //  S = DecToBin(n);
  135.     ANS.push(DecToBin(n));
  136. //  S[16] = PS?'1':'0';
  137.     TC = 2;
  138.     Status();
  139. }
  140.  
  141. void XorB(int n){
  142.     ++PC;
  143.     TC = 1;
  144.     Status();
  145.     PS = n < 0;
  146. //  cout << n << endl;
  147. //  R1 = DecToBin(n);// cout << ((S[16]=='0' && PS) || (S[16]=='1' && !PS)) << endl;
  148.     if((ANS.top()[0]=='0' && PS) || (ANS.top()[0]=='1' && !PS)) PS = 1; else PS = 0;
  149. //  S = Xor(ANS.top(),DecToBin(n));
  150.     ANS.push(Xor(ANS.top(),DecToBin(n)));
  151.     TC = 2;
  152.     Status();
  153. }
  154. /*
  155. void ShiftRight(int n){
  156.     if(n<0){
  157.         ShiftLeft(-n);
  158.         return;
  159.     }
  160.     ++PC;
  161.     TC = 1;
  162.     Status();
  163.     PS = 0;
  164.     R1 = DecToBin(n);
  165.     for(string p = R1 ; p != "000000000000000000000000" ; p = Add(p,"111111111111111111111111"))
  166.         BitR(S);
  167.     if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
  168.     TC = 2;
  169.     Status();
  170. }*/
  171. /*
  172. void ShiftLeft(int n){
  173.     if(n<0){
  174.         ShiftRight(-n);
  175.         return;
  176.     }
  177.     ++PC;
  178.     TC = 1;
  179.     Status();
  180.     PS = 0;
  181.     R1 = DecToBin(n);
  182.     for(string p = R1 ; p != "000000000000000000000000" ; p = Add(p,"111111111111111111111111"))
  183.         BitL(S);
  184.     if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
  185.     TC = 2;
  186.     Status();
  187. }*/
  188. /*
  189. string GetMod(int n){
  190.     if(S[0]=='0'){
  191.         R1 = DecToBin(n);
  192.         n = -abs(n);
  193.         string t = DecToBin(n);
  194.         string t1 = S;
  195.         for(;;){   
  196.             if(Add(S,t) == "000000000000000000000000") return Add(S,t);
  197.             if(Add(S,t)[0] == '1') return t1;
  198.             t1 = Add(S,t);
  199.             S = Add(S,t);
  200.             //cout << t1 << endl; system("Pause");
  201.         }
  202.     }else{
  203.         R1 = DecToBin(n);
  204.         n = abs(n);
  205.         string t = DecToBin(n);
  206.         string t1 = S;
  207.         for(;;){   
  208.             if(Add(S,t) == "000000000000000000000000") return Add(S,t);
  209.             if(Add(S,t)[0] == '0') return t1;
  210.             t1 = Add(S,t);
  211.             S = Add(S,t);
  212.             //cout << t1 << endl; system("Pause");
  213.         }
  214.     }
  215.     return "000000000000000000000000";
  216. }*/
  217. /*
  218. void Mod(int n){
  219.     ++PC;
  220.     TC = 1;
  221.     Status();
  222.     PS = 0;
  223.     S = GetMod(n);
  224.     if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
  225.     TC = 2;
  226.     Status();
  227. }*/
  228.  
  229. void Case(string q , bool flag){
  230.     ++PC;
  231.     TC = 1;
  232.     Status();
  233.     if(flag) transform(q.begin() , q.end() , q.begin() , toupper);
  234.     else transform(q.begin() , q.end() , q.begin() , tolower);
  235.     string t;
  236.     for(int i = 0 ; i < 3 && i < q.length() ; ++i){
  237.         t += DecToBin((int)q[i] , 8).substr(0,8);
  238.     }
  239.     ANS.push(t);
  240.     PS = t[0] == '1';
  241.     TC = 2;
  242.     Status();
  243. }
  244.  
  245. int main()
  246. {
  247.     ifstream file("C:\\Users\\Max\\Documents\\Visual Studio 2010\\Projects\\lab2\\Release\\input.txt");
  248.     while(file){
  249.         string s , q;
  250.         int n;
  251.         file >> s;
  252.         q = "";
  253.         if(s =="Case") file >> q;
  254.         file >> n;
  255.         IR = s + " " + q + (q!=""?" ":"") + NtS<int>(n);
  256.         if(s == "Load")
  257.             Load(n);
  258.         else if(s == "Xor")
  259.             XorB(n);
  260.     /*  else if(s == "Stl")
  261.             ShiftLeft(n);
  262.         else if(s == "Str")
  263.             ShiftRight(n);
  264.         else if(s == "Mod")
  265.             Mod(n);*/
  266.         else if(s == "Case")
  267.             Case(q , n);
  268.         if(file)system("Pause");
  269.         cout << endl;
  270.     }
  271.     /////////////////////////////
  272. /*  string s = "Load";
  273.     int k = -32767;
  274.     IR = s + " " + NtS<int>(k);
  275.     Load(k);
  276.  
  277.     s = "Xor";
  278.     k = 9;
  279.     IR = s + " " + NtS<int>(k);
  280.     XorB(k);*/
  281.  
  282. /*  s = "STL";
  283.     k = 3;
  284.     IR = s + " " + NtS<int>(k);
  285.     ShiftLeft(k);*/
  286.  
  287. /*  Load(122);
  288.     cout << endl;
  289.     Mod(3) ;*/
  290.     system("Pause");
  291.     return 0;
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement