Advertisement
osipyonok

Untitled

May 30th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. // lab2_down.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4.  
  5. #include "stdafx.h"
  6.  
  7. //INPUT EXAMPLE
  8. //Load 0 5  
  9. //Load 1 5
  10. //Mod 1 3
  11. //Cnt 1 10 1
  12.  
  13.  
  14. #include "stdafx.h"
  15. #include <iostream>
  16. #include <string>
  17. #include <vector>
  18. #include <map>
  19. #include <fstream>
  20. #include <sstream>
  21. #include <conio.h>
  22.  
  23. using namespace std;
  24.  
  25. #define NUL "00000000000000000000"
  26. #define ONE "00000000000000000001"
  27. #define M_ONE "11111111111111111111"
  28.  
  29. string R1 = NUL, S = NUL, IR; //S - акумулятор
  30. int PC, TC;
  31. bool PS;
  32. bool flag = 0;
  33.  
  34. /*
  35. IR    - регістр команди, містить текстовий запис команди, яка є поточною;
  36. R1    - перший регістр;
  37. PS    - регістр статусу, може містити лише знак останнього результату (в R2 значення -1, тому в PS мінус);
  38. PC    - регістр лічильника команд (зараз виконується 7-ма команда);
  39. TC    - регістр лічильника тактів (зараз виконався 2-й такт).
  40. Якщо має бути одноадресна модель команд, то ще потрібний регістр, який називають акумулятор.
  41. В командах він явно операндом не задається, хоча використовується як реальний операнд.
  42. Типово для команд із акумулятором-опе­рандом є зберігати результат команди саме в акумуляторі.
  43. */
  44.  
  45. template <typename T>
  46. string NtS(T Number){
  47.      ostringstream ss;
  48.      ss << Number;
  49.      return ss.str();
  50. }
  51.  
  52. string Reverse(string s){
  53.     for(int i = 0 ; i < 20 ; ++i)
  54.         s[i]= s[i]=='1'?'0':'1';
  55.     return s;
  56. }
  57.  
  58. string Add(string s1, string s2){
  59.     bool m=0;
  60.     string ans = NUL;
  61.     for(int i = 19 ; i>=0 ; --i){
  62.         if(s1[i]=='0' && s2[i]=='0'){ ans[i] = m?'1':'0'; m = 0;}else
  63.         if(s1[i]!=s2[i]){ ans[i] = m?'0':'1'; m = m?1:0;}else
  64.         if(s1[i]=='1' && s2[i]=='1'){ ans[i] = m?'1':'0'; m = 1;}
  65.     }
  66.     return ans;
  67. }
  68.  
  69. string Complement(string s){
  70.     return(Add(Reverse(s),ONE));
  71. }
  72.  
  73.  
  74. string DecToBin(int n){
  75.     string ans = "";
  76.     if(n>=0){
  77.         while(n != 0){
  78.             ans = ((n % 2)?"1":"0") + ans;
  79.             n/=2;
  80.         }
  81.         while(ans.length()<20)
  82.             ans = "0" + ans;
  83.     }else
  84.         ans = Complement(DecToBin(abs(n)));
  85.     return ans;
  86. }
  87.  
  88. void Status(){
  89.     cout << "IR = " << IR << endl;
  90.     cout << "R1 = ";
  91.     for(int i = 1 ; i <=20 ; ++i)
  92.         cout << R1[i-1] << (i % 4 ? "":" ");
  93.     cout << endl;
  94.         cout << "R2 = ";
  95.     for(int i = 1 ; i <=20 ; ++i)
  96.         cout << S[i-1] << (i % 4 ? "":" ");
  97.     cout << endl << endl;
  98.     cout << "PC = " << PC << endl;
  99.     cout << "TC = " << TC << endl;
  100.     cout << "PS = " << PS << endl;
  101.     cout << endl << endl;
  102. }
  103.  
  104. void Load(int n){
  105.     ++PC;
  106.     TC = 1;
  107.     Status();
  108.     PS = n < 0;
  109.     if(flag)
  110.         S = DecToBin(n);
  111.     else
  112.         R1 = DecToBin(n);
  113. //  S[16] = PS?'1':'0';
  114.     TC = 2;
  115.     Status();
  116. }
  117.  
  118.  
  119. string GetMod(int n){
  120.     if(S[0]=='0'){
  121.         R1 = DecToBin(n);
  122.         n = -abs(n);
  123.         string t = DecToBin(n);
  124.         string t1 = S;
  125.         for(;;){  
  126.             if(Add(S,t) == NUL) return Add(S,t);
  127.             if(Add(S,t)[0] == '1') return t1;
  128.             t1 = Add(S,t);
  129.             S = Add(S,t);
  130.             //cout << t1 << endl; system("Pause");
  131.         }
  132.     }else{
  133.         R1 = DecToBin(n);
  134.         n = abs(n);
  135.         string t = DecToBin(n);
  136.         string t1 = S;
  137.         for(;;){  
  138.             if(Add(S,t) == NUL) return Add(S,t);
  139.             if(Add(S,t)[0] == '0') return t1;
  140.             t1 = Add(S,t);
  141.             S = Add(S,t);
  142.             //cout << t1 << endl; system("Pause");
  143.         }
  144.     }
  145.     return NUL;
  146. }
  147.  
  148. void Mod(int n){
  149.     if(!flag)swap(S , R1);
  150.     ++PC;
  151.     TC = 1;
  152.     Status();
  153.     PS = 0;
  154.     S = GetMod(n);
  155.     if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
  156.     TC = 2;
  157.     if(!flag)swap(S , R1);
  158.     Status();
  159. }
  160.  
  161. void Cnt(int n , bool n1){
  162.     ++PC;
  163.     TC = 1;
  164.     Status();
  165.     PS = 0;
  166.     string t = DecToBin(n);
  167.     int ans = 0;
  168.     for(int i = 0 ; i < t.length() ; ++i) ans += t[i] == '1';
  169.     if(flag){
  170.         S = DecToBin(n1 ? ans : t.length() - ans);
  171.         R1 = t;
  172.         if((S[0]=='0' && PS) || (S[0]=='1' && !PS)) PS = 1; else PS = 0;
  173.     }else{
  174.         R1 = DecToBin(n1 ? ans : t.length() - ans);
  175.         S = t;
  176.         if((R1[0]=='0' && PS) || (R1[0]=='1' && !PS)) PS = 1; else PS = 0;
  177.     }  
  178.     TC = 2;
  179.     Status();
  180. }
  181.  
  182. int main()
  183. {
  184.     ifstream file("C:\\Users\\Max\\Documents\\Visual Studio 2010\\Projects\\lab2_down\\lab2_down\\input.txt");
  185.     while(file){
  186.         string s;
  187.         int n , n1;
  188.         file >> s >> flag >> n;
  189.         if(s == "Cnt") file >> n1;
  190.         IR = s + " " + NtS<int>(n);
  191.         if(s == "Load")
  192.             Load(n);
  193.         else if(s == "Mod")
  194.             Mod(n);
  195.         else if(s == "Cnt")
  196.             Cnt(n , n1);
  197.         if(file)system("Pause");
  198.         cout << endl;
  199.     }
  200.     system("pause");
  201.     return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement