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