В массиве размерности n определить количество нечетных элементов - Assembler
Формулировка задачи:
Помогите пожалуйста...
на языке Assembler написать:
В массиве размерности n определить количество нечетных элементов.
на C++ написал, но не понимаю как перевести на язык асаблера:
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int*mass= new int [n];
int*mas= new int [n];
int i;
for (i=0; i<n; i++) {
cin>> mass[i];
}
int summ_nechet=0;
for(i=0; i<n; i++)
{
if (mass[i]%2)
summ_nechet=summ_nechet+1;
}
printf("%s%d\n", "kolichestva_NeChet= ", summ_nechet);
cout << endl;
system("pause");
return 0;
}Решение задачи: «В массиве размерности n определить количество нечетных элементов»
textual
Листинг программы
org 100h again: mov dx, req mov ah, 9h int 21h call cgetul jc quit call crlf ; собственно, сам подсчёт mov cx, ax ;n mov si, top ;начало массива - значения случайные xor dx, dx ; счётчик @@: lodsw bt ax,0 ; взводим CY в зависимости от бита 0 adc dx,0 ; и прибавляем CY к счётчику loop @B ; n раз push dx mov dx, odds mov ah, 9h int 21h pop ax call out_dec call crlf jmp again quit: int 20h out_dec:pusha mov ebx, 10 xor ecx,ecx @@out_dec: xor edx, edx idiv ebx or dx, 30h ;остаток от деления push dx inc cx ;считаем кол-во цифр or eax, eax ;пока не 0 - делим jnz @@out_dec @@3: pop ax int 29h loop @@3 popa ret cgetul: pushad xor edx, edx mov cx, 5 ; кол-во знаков @l: call getch or al,al jz @l cmp al, 1Bh ; <ESC>? jz cancel cmp al, 0Dh ; <Enter>? jz done cmp al, 08h ; <BkSp>? jnz @F call rubout jmp @l @@: cmp al, 30h jb @l cmp al, 39h ja @l movzx eax,al ; убираем из eax лишнее lea edx,[edx*4+edx] ; EDX = EDX * 5 lea edx,[edx*2+eax-48] ; EDX = EDX * 2 + символ из AL - '0' int 29h loop @l done: mov eax, edx ; clc jmp ex cancel: xor eax, eax dec eax ; EAX = -1 stc ex: mov [ss:esp+1Ch],eax popad ret ; getch: xor ax, ax int 16h ret crlf: push ax mov ax, 0A0Dh int 29h xchg al,ah int 29h pop ax ret rubout: mov eax,edx xor edx,edx idiv dword [ten] mov edx,eax call bksp ret ten: dd 0Ah bksp: mov ax, 2008h int 29h xchg ah,al int 29h xchg ah,al int 29h ret req: db 'Enter array size:$' odds: db 'Odd elements:$' top:
Объяснение кода листинга программы
- Организация данных:
- Переменная
reqсодержит строкуEnter array size: $. - Переменная
oddsсодержит строкуOdd elements: $. - Переменная
topсодержит случайное значение, которое представляет собой верхнюю границу массива. - Переменная
nсодержит размер массива. - Переменная
siсодержит базовый адрес массива. - Переменная
dxиспользуется как счетчик для подсчета нечетных элементов. - Переменная
cxиспользуется для итерации по массиву. - Переменная
ebxиспользуется для деления. - Переменная
ecxиспользуется для итерации по цифрам остатка от деления. - Переменная
edxиспользуется для хранения остатка от деления. - Переменная
eaxиспользуется для хранения результата деления. - Переменная
edxиспользуется для хранения количества цифр остатка от деления. - Переменная
eaxиспользуется для хранения количества нечетных элементов.
- Переменная
- Выполняемый код:
- Код считывает размер массива с помощью функции
getch(), которая считывает символ с клавиатуры. - Код проверяет, является ли введенный символ одним из символов
<ESC>,<Enter>,<BkSp>или '0' - '9'. - Если введенный символ является '0' - '9', код преобразует его в десятичное число и вычисляет количество нечетных элементов в массиве.
- Если введенный символ является одним из символов
<ESC>,<Enter>,<BkSp>, код выполняет соответствующие действия. - Код выводит количество нечетных элементов в массиве с помощью функции
out_dec(), которая выводит десятичное число в обратном порядке. - Код повторяет этот процесс до тех пор, пока не будет введено значение, отличное от '0' - '9'.
- Код завершается, когда пользователь вводит символ '
'.
- Код считывает размер массива с помощью функции
- Ошибки и обработка исключений:
- Если размер массива отрицательный, код выдает сообщение об ошибке и завершается.
- Если введенный символ не является '0' - '9', код выдает сообщение об ошибке и завершается.
- Если введенный символ является одним из символов
<ESC>,<Enter>,<BkSp>, код выполняет соответствующие действия.