Найти количество отрицательных элементов массива, значения которых лежат в некотором диапазоне - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д