Advertisement
Glebzok

3 Assembler Lab (updated)

Mar 23rd, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. short* c_comp(short* numbers);// вычисление на С
  6. short* asm_comp(short* numbers);// вычисление на Ассемблере
  7. void output(short* numbers, char* lng);//вывод чисел
  8. short* input();//ввод чисел
  9. int check_size(char* in);//проверка количетсва элементов
  10. int are_digits(char* in);//проверка на то, что элементы - цифры
  11. int are_spaces(char* in);
  12.  
  13. int main(){
  14.     short* numbers;
  15.     char command;
  16.     while (1){
  17.         if ((numbers = input()) != NULL){
  18.             output(c_comp(numbers), "C");
  19.             output(asm_comp(numbers), "Asm");
  20.         }
  21.         else printf("Error\n");
  22.         while (1){
  23.             printf("Try again? (y\\n)\n");
  24.             scanf("%c", &command);
  25.             if (command == 'y' || command == 'n'){
  26.                 getchar();
  27.                 break;
  28.             }
  29.             else{
  30.                 printf("Error\n");
  31.                 while(getchar() != '\n');
  32.                 continue;
  33.             }
  34.         }
  35.         if (command == 'y') continue;
  36.         else break;
  37.     }
  38.     free(numbers);
  39.     numbers = NULL;
  40.     getchar();
  41.     return 0;
  42. }
  43.  
  44. short*  c_comp(short* numbers){
  45.     short* new_numbers = NULL;
  46.     new_numbers = (short*)malloc(3 * sizeof(short));
  47.     new_numbers[0] = numbers[0];
  48.     if ((numbers[0] == numbers[2]) && (numbers[1] != numbers[0] && (numbers[1] + 3 < 7))){
  49.         new_numbers[1] = numbers[1] + 3;
  50.         new_numbers[2] = numbers[2];
  51.     }
  52.     else if ((numbers[0] == numbers[2]) && (numbers[1] != numbers[0] && (numbers[1] + 3 >= 7))) {
  53.         new_numbers[1] = numbers[1];
  54.         new_numbers[2] = numbers[2];
  55.     }
  56.     else if ((numbers[0] != numbers[2]) && (numbers[1] != numbers[0] && (numbers[1] + 3 < 7))){
  57.         new_numbers[1] = numbers[2];
  58.         new_numbers[2] = numbers[1];
  59.     }
  60.     else {
  61.         new_numbers[1] = numbers[1];
  62.         new_numbers[2] = numbers[2];
  63.     }
  64.     return new_numbers;
  65. }
  66.  
  67. short* asm_comp(short* numbers){
  68.     short first = numbers[0], second = numbers[1], third = numbers[2];
  69.     short* new_numbers = NULL;
  70.     new_numbers = (short*)malloc(3 * sizeof(short));
  71.     new_numbers[0] = numbers[0];
  72.     _asm
  73.     {
  74.         MOV AX, first;// первая цифра а AX
  75.         MOV BX, third;// вторая цифра в BX
  76.         CMP AX, BX;
  77.         JE first_is_equal_to_third;// если первая цифра равна третьей
  78.         JNE something_is_wrong;// если первая цифра не равна третьей
  79.     first_is_equal_to_third:// первая цифра равна третьей
  80.         MOV BX, second;// вторая цифра в BX
  81.         CMP AX, BX;
  82.         JE something_is_wrong;// если первая цифра равна второй
  83.         JNE first_is_not_equal_to_second;// если первая цифра не равна второй
  84.     first_is_not_equal_to_second://первая цифра не равна второй
  85.         CMP BX, 7;
  86.         JB second_plus_3_is_lower_than_10;// если нет переполнения
  87.         JAE end;// если есть переполнение
  88.     second_plus_3_is_lower_than_10:// нет переполнения
  89.         ADD BX, 3;
  90.         MOV second, BX;
  91.         JMP end;
  92.     something_is_wrong:// что-то не так, но вторая цифра не была увеличена
  93.         MOV AX, third;// третья цифра в AX
  94.         MOV BX, second;// вторая цифра в BX
  95.         MOV third, BX;// меняем местами вторую и третью цифры
  96.         MOV second, AX;
  97.         JMP end;
  98.     end:
  99.     }
  100.     new_numbers[1] = second;
  101.     new_numbers[2] = third;
  102.     return new_numbers;
  103. }
  104.  
  105. void output(short* numbers, char* lng){
  106.     int i;
  107.     short* new_numbers = NULL;
  108.     new_numbers = numbers;
  109.     printf("%s rezult:", lng);
  110.     for (i = 0; i < 3; i++) printf("%2d", new_numbers[i]);
  111.     printf("\n");
  112.     free(new_numbers);
  113. }
  114.  
  115. short* input(){
  116.     char in[50];
  117.     short i, j;
  118.     short* numbers = NULL;
  119.     int length, space_cnt = 0, length_of_string, char_cnt = 0;
  120.     printf("Insert 3 numbers:\n");
  121.     gets(&in);
  122.     length_of_string = strlen(&in);
  123.     length = length_of_string - 2;
  124.     numbers = malloc((short*)(3 * sizeof(short)));
  125.     if (!check_size(length) && !are_digits(in) && !are_spaces(in)){
  126.         for (i = 0, j = 0; i < length, j < length + 2; i++, j += 2)
  127.             numbers[i] = in[j] - '0';
  128.         return numbers;
  129.     }
  130.     else return NULL;
  131. }
  132.  
  133. int check_size(int length){
  134.     if (length == 3) return 0;
  135.     else return 1;
  136. }
  137.  
  138. int are_digits(char* in){
  139.     int i, cnt = 0;
  140.     int length = strlen(&in);
  141.     for (i = 0; i < length + 2; i += 2){
  142.         if (in[i] < '0' || in[i] > '9') cnt++;
  143.     }
  144.     if (cnt == 0) return 0;
  145.     else return 1;
  146. }
  147.  
  148. int are_spaces(char* in){
  149.     int i, cnt = 0;
  150.     int length = strlen(&in);
  151.     for (i = 1; i < length + 1; i += 2){
  152.         if (in[i] != ' ') cnt++;
  153.     }
  154.     if (cnt == 0) return 0;
  155.     else return 1;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement