Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Лабораторная работа №5 (18)+
- #include "stdafx.h"
- #include <iostream> //cin и cout
- #include <fstream> //работа с файлами ifstream/ofstream
- #include <conio.h> //getch
- using namespace std;
- //Вычисляет функцию на встроенном ассемблере
- int FuncMas(int* mas, int n, int &r){
- __asm{
- xor esi, esi; готовим регистр индекса массива: esi=0
- xor edi, edi;
- inc edi; готовим регистр для хранения произведения: edi=1
- xor edx, edx; этот регистр будет накапливать кубы, если он останет равным 0, то в массиве нет отрицательных чисел: edx=0
- mov ebx, mas; ebx указывает на начало массива
- mov ecx, n; счётчик цикла по всем элементам массива
- jecxz konec; завершить если длина массива 0
- begin_loop:
- mov eax, [ebx+esi*4]; определяем текущий элемент
- or eax, eax;
- jns end_loop; если число положительное, то переходим в конец цикла
- mov edx, eax; edx=A[i]
- imul edx, eax; edx = A[i]^2
- jo error;
- imul edx, eax; edx = A[i]^3
- jo error;
- imul edi, edx; накапливаем произведение
- jo error;
- end_loop:
- inc esi; переходим к следующему элементу
- loop begin_loop; повторяем цикл для всех элементов массива
- konec:
- or edx, edx
- jz otvet_net;
- mov eax, edi; возвращаем накопленное произведение
- mov edx,r; edx=r
- xor ebx, ebx; ebx=0
- mov dword ptr[edx], ebx; возвращает флаг = 0
- jmp vihod;
- otvet_net:
- mov edx,r; edx=r
- xor ebx, ebx; ebx=0
- inc ebx; ebx=1
- mov dword ptr[edx], ebx; возвращает флаг = 1
- jmp vihod;
- error:
- mov edx,r; edx=r
- mov ebx, 2; ebx=2
- mov dword ptr[edx], ebx; возвращает флаг = 2
- vihod:
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- setlocale( LC_ALL,"Russian" );
- cout<< "Программа находит произведение кубов всех отрицательных элементов массива\n\n";
- int A[100];
- int z, er, n=0;
- ifstream read_file;
- read_file.open ("input.txt",ios::in);
- for(int i=0; (!read_file.eof())&&(i<100); i++){
- read_file >> A[i];
- n++;
- }
- read_file.close();
- cout << "Массив: ";
- for(int i=0; i<n; i++)
- cout << A[i] << " ";
- cout << "\n";
- z=FuncMas(A, n, er);
- if(er==2) cout << "Переполнение";
- else if(er==1) cout << "В массиве нет отрицательных чисел";
- else cout << "Ответ: " << z;
- getch();
- return 0;
- }
- //-2147483648...2147483647
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement