Advertisement
Guest User

Untitled

a guest
Apr 19th, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. // Лабораторная работа №5 (18)+
  2.  
  3. #include "stdafx.h"
  4. #include <iostream> //cin и cout
  5. #include <fstream>  //работа с файлами ifstream/ofstream
  6. #include <conio.h>  //getch
  7.  
  8. using namespace std;
  9.  
  10. //Вычисляет функцию на встроенном ассемблере
  11. int FuncMas(int* mas, int n, int &r){
  12.     __asm{
  13.     xor esi, esi;               готовим регистр индекса массива: esi=0
  14.     xor edi, edi;          
  15.     inc edi;                    готовим регистр для хранения произведения: edi=1
  16.     xor edx, edx;               этот регистр будет накапливать кубы, если он останет равным 0, то в массиве нет отрицательных чисел: edx=0
  17.     mov ebx, mas;               ebx указывает на начало массива
  18.     mov ecx, n;                 счётчик цикла по всем элементам массива
  19.  
  20.     jecxz konec;                завершить если длина массива 0
  21. begin_loop:
  22.     mov eax, [ebx+esi*4];       определяем текущий элемент
  23.     or eax, eax;
  24.     jns end_loop;               если число положительное, то переходим в конец цикла
  25.     mov edx, eax;               edx=A[i]
  26.     imul edx, eax;              edx = A[i]^2
  27.     jo error;
  28.     imul edx, eax;              edx = A[i]^3
  29.     jo error;
  30.     imul edi, edx;              накапливаем произведение
  31.     jo error;
  32. end_loop:
  33.     inc esi;                    переходим к следующему элементу
  34.     loop begin_loop;            повторяем цикл для всех элементов массива
  35.  
  36. konec:
  37.     or edx, edx
  38.     jz otvet_net;
  39.     mov eax, edi;               возвращаем накопленное произведение
  40.     mov edx,r;                  edx=r
  41.     xor ebx, ebx;               ebx=0
  42.     mov dword ptr[edx], ebx;    возвращает флаг = 0
  43.     jmp vihod;
  44. otvet_net:
  45.     mov edx,r;                  edx=r
  46.     xor ebx, ebx;               ebx=0
  47.     inc ebx;                    ebx=1
  48.     mov dword ptr[edx], ebx;    возвращает флаг = 1
  49.     jmp vihod;
  50. error:
  51.     mov edx,r;                  edx=r
  52.     mov ebx, 2;                 ebx=2
  53.     mov dword ptr[edx], ebx;    возвращает флаг = 2
  54. vihod:
  55.     }
  56. }
  57.  
  58. int _tmain(int argc, _TCHAR* argv[])
  59. {
  60.     setlocale( LC_ALL,"Russian" );
  61.     cout<< "Программа находит произведение кубов всех отрицательных элементов массива\n\n";
  62.  
  63.     int A[100];
  64.     int z, er, n=0;
  65.     ifstream read_file;
  66.     read_file.open ("input.txt",ios::in);
  67.     for(int i=0; (!read_file.eof())&&(i<100); i++){
  68.         read_file >> A[i];
  69.         n++;
  70.     }
  71.     read_file.close();
  72.  
  73.     cout << "Массив: ";
  74.     for(int i=0; i<n; i++)
  75.         cout << A[i] << " ";
  76.     cout << "\n";
  77.  
  78.     z=FuncMas(A, n, er);
  79.     if(er==2) cout << "Переполнение";
  80.     else if(er==1) cout << "В массиве нет отрицательных чисел";
  81.         else cout << "Ответ: " << z;
  82.     getch();
  83.     return 0;
  84. }
  85. //-2147483648...2147483647
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement