Посчитать количество нулевых, четных и нечетных элементов массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Мне необходимо сделать вставку в Си на ассемблере. Алгоритм должен выполняться именно на нем. Суть задания следующая: дан одномерный целочисленный массив. Посчитать кол-во нулевых, четных и нечетных элементов, а также их суммы и записать результата в другой целочисленный одномерный массив (то есть массив состоит из шести ячеек: первые три - кол-во элементов, последние три - их суммы). Вот, что я написал:
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int a[15], b[6], n, c;
    int i;
    for (i = 0; i < 6; i++)
        b[i] = 0;
    puts("Введите кол-во элементов в массиве не более 15");
    do{
        fflush(stdin);
        c=scanf("%d", &n);
        if (c != 1 || n < 1||n>15) puts("Пожалуйста, повторите ввод");
    } while (c != 1 || n < 1||n>15);

    fflush(stdin);
    printf("Введите массив из %d элементов\n", n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int del = 2;
    _asm
    {
 
        mov ecx, n;             загрузить в ECX n
        mov edi, 0;             загрузить в EBX 0
        again: mov eax, a[edi]; загрузить в EAX а[EBX]
        cmp eax, 0;             если элемент массива равен нулю
        jz nulrez;              перейти к метке nulrez
        push eax;               сохранить элемент массива в стеке
        cdq;                    преобразовать в двойное слово
        mov ebx,del
        div ebx;
        pop eax;
        cmp edx, 0;             если элемент четный
        jz chet;                перейти к метке chet
        jmp nechet;
    nulrez : mov esi, 0;
        jmp core;
    chet: mov esi, 1;
        jmp core;
    nechet: mov esi, 2;
    core: add eax, b[esi];      сложить элемент массива и ячейку памяти
        mov b[esi], eax;        для хранения кол - ва определенных элементов; здесь ошибка
        mov eax, b[esi + 3];
        inc eax;
        mov b[esi + 3], eax;
        inc esi;
        loop again;
    }
 
    for (i = 0; i < 6; i++)
        printf("%d ", b[i]);
    printf("\n");
    system("pause");
    return 0;
}
ошибка происходит при записи значений в массив b. Именно при записи, со считыванием проблем нет. Вместо того, что запоминать значения по конкретным адресам, во-первых, он их начинает коверкать (к примеру, 1 изменяет на 65536) и начинает запись не с того адреса, который указан, а с начала массива. Объясните, пожалуйста, что я делаю не так.

Решение задачи: «Посчитать количество нулевых, четных и нечетных элементов массива»

textual
Листинг программы
       ;В eax число, которое надо проверить на четность и не испортить его
       test al,1
       jz chet

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

  1. eax - это регистр, который содержит число для проверки на четность и нечетность.
  2. al - это младший байт регистра eax, который содержит последнее число для проверки.
  3. test al,1 - это инструкция, которая проверяет, является ли младший байт регистра eax равным 1.
  4. jz chet - это инструкция, которая перенаправляет выполнение программы на метку chet, если младший байт регистра eax равен 0.
  5. Код после этой инструкции будет выполнен только в том случае, если младший байт регистра eax не равен 0.

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


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

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

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