
Добавил:
rus2an
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:3к5с Архитектура информационных систем / Работы / КР / КР / КР
.cpp/*
Даны два одномерных массива одинаковой размерности.
Массивы заполнить случайными числами.
Сформировать третий массив следующим образом:
если сумма двух соответствующих элементов
больше заданного пользователем числа записать
в массив 1, если меньше 0. Подсчитать количество
1 и 0 в итоговом массиве.
*/
#include "pch.h"
#include <iostream>
#include <time.h>
#include <conio.h>
#include <stdio.h>
void main() {
setlocale(LC_ALL, "Rus");
srand(time(NULL));
int a[10] = { 0 };
int b[10] = { 0 };
int d[10] = { 0 };
int z[10] = { 0 };
int c;
int summ = 0;
int summ2 = 0;
for (int i = 0; i < 10; i++)
{a[i] = 0 + rand() % 100;
b[i] = 0 + rand() % 100;}
printf("\nМассив #1: ");
for (int i = 0; i < 10; i++)
{printf("%i\, ", a[i]);}
printf("\nМассив #2: ");
for (int i = 0; i < 10; i++)
{printf("%i\, ", b[i]);}
_asm
{
lea EAX, a //читаем адрес для переменной массива а
lea EBX, b //читаем адрес для переменной массива b
mov ESI, 0 //шаг увеличения адреса на 4
mov ECX, 10 //кол-во итераций
for1: //первый цикл
mov EDX, [EAX + ESI] //увеличение адреса на 4 для переменной a массива
mov EDI, [EBX + ESI] //увеличение адреса на 4 для переменной b массива
add EDI, EDX //сложение элементов массива
cmp EDI, 50 //сравнение суммы с числом
jc lb1 //если сумма меньше, прыгает.
add summ, 1
mov EDX, 1 //ЗАПИСЬ В РЕЗУЛЬТАТ 1
push EDX //записывает результат в стэк
jmp end //прыгаем на end
lb1 : //метка
add summ2, 1
mov EDX, 0 //запись в результат 0
push EDX //записывает результат в стэк
end : //прыгнули
add ESI, 4 // +4 к шаг увеличения адреса
loop for1 //возвращение к шапке цикла
lea EAX, d //читаем адрес переменной массива d
mov ESI, 0 //esi =0
mov ECX, 10 //ecx =10
for2 : //шапка второго цикла. цикл записи данных в массив
pop EDI //чтение из стека
mov[EAX + ESI], EDI
add ESI, 4 //перемещение на следующий элемент массива
loop for2 //возвращение в шапку 2 цикла
//////////////////////////
lea EAX, d //читаем адрес для переменной массива а
mov ESI, 0 //шаг увеличения адреса на 4
mov ECX, 10 //кол-во итераций
for3: //первый цикл
mov EDX, [EAX + ESI] //увеличение адреса на 4 для переменной a массива
push EDX //записывает результат в стэк
add ESI, 4 // +4 к шаг увеличения адреса
loop for3 //возвращение к шапке цикла
/////////////////////////
lea EAX, z //читаем адрес переменной массива d
mov ESI, 0 //esi =0
mov ECX, 10 //ecx =10
for4: //шапка второго цикла. цикл записи данных в массив
pop EDI //чтение из стека
mov[EAX + ESI], EDI
add ESI, 4 //перемещение на следующий элемент массива
loop for4 //возвращение в шапку 2 цикла
//////////////////////
}
printf("\nМассив #3: ");
for (int i = 0; i < 10; i++) {
printf("%i\, ", z[i]);
}
printf("\nВсего единиц:%i", summ);
printf("\nВсего нулей:%i\n", summ2);
system("pause");
}