В массиве размерности 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:

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

  1. Организация данных:
    • Переменная req содержит строку Enter array size: $.
    • Переменная odds содержит строку Odd elements: $.
    • Переменная top содержит случайное значение, которое представляет собой верхнюю границу массива.
    • Переменная n содержит размер массива.
    • Переменная si содержит базовый адрес массива.
    • Переменная dx используется как счетчик для подсчета нечетных элементов.
    • Переменная cx используется для итерации по массиву.
    • Переменная ebx используется для деления.
    • Переменная ecx используется для итерации по цифрам остатка от деления.
    • Переменная edx используется для хранения остатка от деления.
    • Переменная eax используется для хранения результата деления.
    • Переменная edx используется для хранения количества цифр остатка от деления.
    • Переменная eax используется для хранения количества нечетных элементов.
  2. Выполняемый код:
    • Код считывает размер массива с помощью функции getch(), которая считывает символ с клавиатуры.
    • Код проверяет, является ли введенный символ одним из символов <ESC>, <Enter>, <BkSp> или '0' - '9'.
    • Если введенный символ является '0' - '9', код преобразует его в десятичное число и вычисляет количество нечетных элементов в массиве.
    • Если введенный символ является одним из символов <ESC>, <Enter>, <BkSp>, код выполняет соответствующие действия.
    • Код выводит количество нечетных элементов в массиве с помощью функции out_dec(), которая выводит десятичное число в обратном порядке.
    • Код повторяет этот процесс до тех пор, пока не будет введено значение, отличное от '0' - '9'.
    • Код завершается, когда пользователь вводит символ ''.
  3. Ошибки и обработка исключений:
    • Если размер массива отрицательный, код выдает сообщение об ошибке и завершается.
    • Если введенный символ не является '0' - '9', код выдает сообщение об ошибке и завершается.
    • Если введенный символ является одним из символов <ESC>, <Enter>, <BkSp>, код выполняет соответствующие действия.

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


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

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

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