Найти количество отрицательных элементов массива, значения которых лежат в некотором диапазоне - Assembler
Формулировка задачи:
Найти количество отрицательных элементов массива, значения которых лежат в некотором(как я понял тоже отрицательном, что есть логично) диапазоне
(указывает на нужный мне элемент, но заносит в регистр черт знает что) пробовал - вообще не то. Пожалуйста, укажите мои ошибки.
mov count_asm, 0
mov ecx, col_el
xor esi, esi
jecxz End
Cycl :
xor eax, eax
mov eax, arr_asm[esi]
cmp eax, 0
jg EndCycl
cmp eax, D
jg EndCycl
cmp eax, C
jl EndCycl
inc count_asm
EndCycl :
inc esi
loop Cycl
End :
Вот весь код. Программа неадекватно ведет себя в месте
mov eax, arr_asm[esi]
mov eax, arr_asm[esi*4]
/*Задан числовой массив А[1..M].
Подсчитать количество отрицательных элементов массива,
значения которых лежат в диапазоне от C до D
*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define MAX_LENGTH 100
long A[MAX_LENGTH], arr_asm[MAX_LENGTH];
long count, count_asm, col_el, C, D;
char is_exit;
int main()
{
FILE *fin;
setlocale(LC_ALL, "Rus");
printf("\t\t\t-------Работа с массивом-------\n");
printf("Для продолжения ввода данных - Y(y), для выхода - N(n)\n");
// Открыть файл с исходными данными
if ((fin = fopen("in.txt", "r")) == NULL)
{
printf("\nНевозможно открыть файл "in.txt"!\n");
printf("Введите количество елементов, верхний и нижний диапазоны, массив:\n");
fin = stdin;
}
for (;;)
{
fscanf_s(fin, "%d", &col_el);
if (col_el <= 0 || col_el > MAX_LENGTH)
{
printf("Некорректный ввод количества элементов!\n");
continue;
}
fscanf_s(fin, "%d", &D);
if (D > 0)
{
printf("Некорректный ввод верхнего диапазона!\n");
continue;
}
fscanf_s(fin, "%d", &C);
if (C > 0)
{
printf("Некорректный ввод нижнего диапазона!\n");
continue;
}
count = 0;
for (int i = 0; i < col_el; i++)
{
fscanf(fin, "%d", &A[i]);
arr_asm[i] = A[i];
if (A[i] <= D && A[i] >= C)
{
count++;
}
}
//======================Assembler======================
__asm{
mov count_asm, 0
mov ecx, col_el
xor esi, esi
jecxz End
Cycl :
xor eax, eax
mov eax, arr_asm[esi]
cmp eax, 0
jg EndCycl
cmp eax, D
jg EndCycl
cmp eax, C
jl EndCycl
inc count_asm
EndCycl :
inc esi
loop Cycl
End :
}
printf("\nВерхний и нижний диапазоны: %d %d\n", D, C);
printf("Исходный масив имеет длину: %i\n", col_el);
for (int i = 0; i < col_el; i++)
printf("%i ", A[i]);
// Вывод результатов
printf("\nКоличество чисел в заданном диапазоне(C): %d\n", count);
printf("Количество чисел в заданном диапазоне(Asm): %d\n", count_asm);
fscanf(fin, " %c", &is_exit);
if (is_exit == 'Y' || is_exit == 'y')
continue;
if (is_exit == 'N' || is_exit == 'n')
break;
}
return 0;
}Решение задачи: «Найти количество отрицательных элементов массива, значения которых лежат в некотором диапазоне»
textual
Листинг программы
-------Работа с массивом------- Для продолжения ввода данных - Y(y), для выхода - N(n) Верхний и нижний диапазоны: -5 -10 Исходный масив имеет длину: 3 -3 -7 -13 Количество чисел в заданном диапазоне(C): 1 Количество чисел в заданном диапазоне(Asm): 1 Верхний и нижний диапазоны: -3 -15 Исходный масив имеет длину: 5 -1 -5 -10 20 10 Количество чисел в заданном диапазоне(C): 2 Количество чисел в заданном диапазоне(Asm): 2
Объяснение кода листинга программы
- Вводится значение переменной
yдля продолжения ввода данных илиnдля выхода. - Определяются верхний и нижний диапазоны значений.
- Вычисляется длина исходного массива.
- Выводится количество чисел в заданном диапазоне для языка программирования C.
- Выводится количество чисел в заданном диапазоне для языка программирования Assembler.
- Изменяются верхний и нижний диапазоны значений.
- Вычисляется новая длина исходного массива.
- Выводится количество чисел в заданном диапазоне для языка программирования C.
- Выводится количество чисел в заданном диапазоне для языка программирования Assembler.