Advertisement
osipyonok

Untitled

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