Найти количество различных элементов в данном массиве и вывести их на экран - Assembler

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

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

Дан целочисленный массив. Найти количество различных элементов в данном массиве и вывести их на экран. Знаю, что такая тема уже была, но она не работает. Ругается на currString и IncCoun. исправьте пожалуйста)

Решение задачи: «Найти количество различных элементов в данном массиве и вывести их на экран»

textual
Листинг программы
.model small
 
.stack 200h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        msgArray        db      'Array:', 0Dh, 0Ah, '$'
        msgResult       db      0Dh, 0Ah, 'Amount: ', '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
        N               dw      10
        Array           dw      26, 46, 82, -64, 81, 46, -43, 27, -94, 86
.data?
        Count           dw      ?       ;количество различных элементов в массиве
.code
 
;Выводит 16-разрядное число со знаком из регистра AX на экран
;на входе:
;  ax - число для отображения
;на выходе:
;  число на экране
ShowInt16       proc
        push    ax
        push    bx
        push    cx
        push    dx
        mov     bx,     10      ;основание системы счисления (делитель)
        xor     cx,     cx      ;количество символов в модуле числа
        or      ax,     ax      ;для отрицательного числа
        jns     @@div
                neg     ax      ;поменять знак (сделать положительным)
                push    ax      ;и вывести на экран символ "-" (минус)
                mov     ah,     02h
                mov     dl,     '-'
                int     21h
                pop     ax
        @@div:                  ;делим число на 10
                xor     dx,     dx
                div     bx
                push    dx      ;остаток сохраняем в стеке
                inc     cx      ;количество цифр в числе
                or      ax,     ax
        jnz     @@div           ;повторяем, пока в числе есть цифры
        mov     ah,     02h
        @@store:
                pop     dx      ;извлекаем цифры (остатки от деления на 10) из стека
                add     dl,     '0'     ;преобразуем в символы цифр
                int     21h     ;и выводим их на экран
        loop    @@store
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowInt16       endp
 
;Вывод массива слов (word)
;на входе:
;  cx - количество выводимых элементов
;  ds:dx - адрес массива слов
ShowArray       proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        jcxz    @@Exit          ;если массив пустой - завершить
 
        mov     si,     1       ;индекс элемента массива
        mov     di,     dx      ;адрес текущего элемента массива
        @@ForI:
                mov     ax,     [di]
                call    ShowInt16
                mov     ah,     02h
                mov     dl,     ' '
                int     21h
                ;переход к следующему элементу
                inc     si
                add     di,     2
        loop    @@ForI
@@Exit:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowArray       endp
 
;Сортировка "пузырьком" массива двухбайтных чисел со знаком
;на входе
;  ds:si - адрес массива
;  cx    - количество элементов в массиве
BubbleSort      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        ;настройка для строковых операций
        mov     ax,     ds
        mov     es,     ax
        cld
 
        ;получение адреса N-го элемента массива
        dec     cx
        mov     ax,     2
        mul     cx
        add     si,     ax
        mov     dx,     si                              ;dx - адрес a[N]
        @@ForI:                                         ;for i:=1 to N-1 do
                mov     si,     dx                      ;begin
                push    cx                              ;  for j:=N downto i+1 do
                @@ForJ:                                 ;  begin
                        mov     ax,     [si]            ;    if(a[j] < a[j-1]) then
                        cmp     ax,     [si-2]
                        jge     @@NextJ                 ;    begin
                                push    word ptr [si-2] ;      temp:=a[j-1];
                                mov     [si-2], ax      ;      a[j-1]:=a[j];
                                pop     word ptr [si]   ;      a[i]:=temp;
                @@NextJ:                                ;    end;
                        sub     si,     2
                loop    @@ForJ                          ;  end;
                pop     cx
        loop    @@ForI                                  ;end;
 
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
BubbleSort      endp
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;вывод исходного массива
        mov     ah,     09h
        lea     dx,     [msgArray]
        int     21h
        mov     cx,     [N]
        lea     dx,     [Array]
        call    ShowArray
        ;обработка массива - подсчёт различных элементов
        ; - сортировка
        mov     cx,     [N]
        lea     si,     [Array]
        call    BubbleSort
        ; - сравнение соседних элементов и подсчёт различных
        mov     cx,     [N]
        lea     si,     [Array]
        cld
        mov     dx,     1       ;Count:=1 - количество различных элементов
        lodsw
        dec     cx
        @@For:
                mov     bx,     ax
                lodsw
                cmp     ax,     bx
                je      @@Next
                inc     dx
        @@Next:
        loop    @@For
        mov     [Count],        dx
        ;вывод результата
        mov     ah,     09h
        lea     dx,     [msgResult]
        int     21h
        mov     ax,     [Count]
        call    ShowInt16
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

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

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