Найти количество различных элементов в данном массиве и вывести их на экран - 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