Найти количество отрицательных элементов массива, значения которых лежат в некотором диапазоне - 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

Объяснение кода листинга программы

  1. Вводится значение переменной y для продолжения ввода данных или n для выхода.
  2. Определяются верхний и нижний диапазоны значений.
  3. Вычисляется длина исходного массива.
  4. Выводится количество чисел в заданном диапазоне для языка программирования C.
  5. Выводится количество чисел в заданном диапазоне для языка программирования Assembler.
  6. Изменяются верхний и нижний диапазоны значений.
  7. Вычисляется новая длина исходного массива.
  8. Выводится количество чисел в заданном диапазоне для языка программирования C.
  9. Выводится количество чисел в заданном диапазоне для языка программирования Assembler.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы