Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4.  
  5. using namespace std;
  6. class Processor
  7. {
  8. public:
  9. // 32 битные регистры
  10. unsigned long int eax;
  11. unsigned long int ebx;
  12. // 16 битные регистры
  13. unsigned short int ax;
  14. unsigned short int bx;
  15. unsigned short int cx;
  16. unsigned short int dx;
  17. unsigned short int ex;
  18. unsigned short int fx;
  19. // 8 битные регистры
  20. unsigned char ah;
  21. unsigned char al;
  22. unsigned char bh;
  23. unsigned char bl;
  24. unsigned char ch;
  25. unsigned char cl;
  26. unsigned char dh;
  27. unsigned char dl;
  28. Processor()
  29. {
  30. //32
  31. eax = 0;
  32. ebx = 0;
  33. //16
  34. ax = 0;
  35. bx = 0;
  36. cx = 0;
  37. dx = 0;
  38. ex = 0;
  39. fx = 0;
  40. //8
  41. ah = 0;
  42. al = 0;
  43. bh = 0;
  44. bl = 0;
  45. ch = 0;
  46. cl = 0;
  47. dh = 0;
  48. dl = 0;
  49. };
  50. //непосредственная адресация
  51. void mov(unsigned char *reg, unsigned char num)
  52. {
  53. *reg = num;
  54. };
  55. //регистровая адрессация
  56. void mov(unsigned char *op1, unsigned char *op2)
  57. {
  58. *op1 = *op2;
  59. };
  60. //сложение
  61. void add(unsigned char *op1, unsigned char *op2)
  62. {
  63. *op1 = *op1 + *op2;
  64. };
  65. void add(unsigned char *op1, unsigned char num)
  66. {
  67. *op1 = *op1 + num;
  68. };
  69. /* ВЫЧИТАНИЕ ЧИСЛА ИЗ РЕГИСТРА */
  70. void sub(unsigned char *op1, unsigned char num)
  71. {
  72. neg(&num); // инвертируем
  73. add(&num, 1); // переводим в дополнительный код
  74. add(op1, num);
  75. };
  76. /* ВЫЧИТАНИЕ РЕГИСТРА ИЗ РЕГИСТРА */
  77. void sub(unsigned char *op1, unsigned char *op2)
  78. {
  79. neg(op2); // инвертируем
  80. add(op2, 1); // переводим в дополнительный код
  81. add(op1, op2);
  82. };
  83. //сдвиг влево,передаваемое число - количество разрядов сдвига
  84. void ls(unsigned char *op1, unsigned char num)
  85. {
  86. *op1 = *op1 << num;
  87. };
  88. //сдвиг вправо,передаваемое число - количество разрядов сдвига
  89. void rs(unsigned char *op1, unsigned char num)
  90. {
  91. *op1 = *op1 >> num;
  92. };
  93. //операция инверсии
  94. void neg(unsigned char *op1)
  95. {
  96. *op1 = ~*op1;
  97. };
  98. // операция умножения регистра на число
  99. void mul(unsigned char *op1, unsigned char num)
  100. {
  101. *op1 = *op1 * num;
  102. }
  103. // операция умножения регистра на регистр
  104. void mul(unsigned char *op1, unsigned char *op2)
  105. {
  106. unsigned char buff = *op1;
  107. for (unsigned char i = 1; i < *op2; i++)
  108. {
  109. *op1 = *op1 + buff;
  110. };
  111. }
  112.  
  113. };
  114.  
  115. int main()
  116. {
  117. Processor proc;
  118.  
  119. unsigned char *rega = &proc.ah;
  120. unsigned char *regb = &proc.bh;
  121. proc.mov(rega, 2);
  122. proc.mov(regb, 5);
  123. proc.mul(rega, regb);
  124. proc.ls(regb, 1);
  125. proc.mul(rega, 2);
  126. printf("%d \n", *rega);
  127. printf("%d \n", *regb);
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement