Посчитать количество нулевых, четных и нечетных элементов массива - Assembler
Формулировка задачи:
Здравствуйте. Мне необходимо сделать вставку в Си на ассемблере. Алгоритм должен выполняться именно на нем. Суть задания следующая: дан одномерный целочисленный массив. Посчитать кол-во нулевых, четных и нечетных элементов, а также их суммы и записать результата в другой целочисленный одномерный массив (то есть массив состоит из шести ячеек: первые три - кол-во элементов, последние три - их суммы). Вот, что я написал:
ошибка происходит при записи значений в массив b. Именно при записи, со считыванием проблем нет. Вместо того, что запоминать значения по конкретным адресам, во-первых, он их начинает коверкать (к примеру, 1 изменяет на 65536) и начинает запись не с того адреса, который указан, а с начала массива. Объясните, пожалуйста, что я делаю не так.
#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; }
Решение задачи: «Посчитать количество нулевых, четных и нечетных элементов массива»
textual
Листинг программы
;В eax число, которое надо проверить на четность и не испортить его test al,1 jz chet
Объяснение кода листинга программы
eax
- это регистр, который содержит число для проверки на четность и нечетность.al
- это младший байт регистраeax
, который содержит последнее число для проверки.test al,1
- это инструкция, которая проверяет, является ли младший байт регистраeax
равным 1.jz chet
- это инструкция, которая перенаправляет выполнение программы на меткуchet
, если младший байт регистраeax
равен 0.- Код после этой инструкции будет выполнен только в том случае, если младший байт регистра
eax
не равен 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д