Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2017, 18:06   #1
MarkAfe
 
Регистрация: 14.05.2017
Сообщений: 5
По умолчанию Задача с обнулением одинаковых элементов массива

Есть задача: Занулить элементы массива А(I) имеющие одинаковые значения. I=1,2,..,10, Определить количество оставшихся элементов.
Код работает, но зануляет только дубликаты. И в чем проблема, собственно говоря, не могу понять, как можно сделать чтобы занулялись все элементы, а не только дубликаты.
Код:
.model small     ;Модель памяти
.stack 100h      ;Сегмент стека
.data            ;Сегмент данных
len equ 10       ;Колличство элементов в mas
k db 10        ;Счетчик оставшихся элементов k=10
mas db 1,2,1,3,3,4,5,0,7,6 ;элементы массива
.code          ;Сегмент кода
start:
 mov ax,@data  ;Физическйий адрес сегмента данных в регистре ax
 mov ds,ax
 lea si, mas   ;si от 0 до 9-1(for i:=0 to 9-1)
 mov cx,len    ;Длину поля mas в cx
 jcxz exit     ;Проверка cx на 0, если 0, то выход
 dec cx        ;cx=cx-1
ForI:          ;Внешний цикл 
  mov di, si   ;di от si+1 до 9(for j:=i+1 to 9)
  add di, 1    ;Присваем значение 1
  push cx      ;запоминаем в регистр cx
  mov al, [si] ;al=индексу элемента
  cmp al, 0    ;Сравниваем с 0
  je  NextI    ;Если да, то на метку NextI
ForJ:          ;Внутренний цикл
 cmp al, [di]  ;если al равну инд.(if A[i]=A[j]then)
 jne NextJ     ;то на метку NextJ 
 mov [di], byte ptr 0  ;Обнуляем элементA[j]:=0;
 dec k         ;k:=k-1
NextJ:         ;Метка наращивания индекса элемента и счетчик
 add di, 1     ;Переходим к следующему элементу внутри цикла
 loop ForJ     ;Возвращаемся к метке ForJ
NextI:         ;Метка перехода к следующему элементу внешнего цикла
 pop cx        ;Вытасикиваем из регистра 
 add si, 1     ;Переход к следующему элементу внешнего цикла
 loop ForI     ;Возвращаемся в метку ForI
exit:          ;метка выхода из программы
 mov ax,4c00h
 int 21h   ;Возврат управления операционной системе
end start
MarkAfe вне форума Ответить с цитированием
Старый 28.09.2017, 19:05   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

почитай про строковые инструкции LODSB, STOSB, SCASB.
SCASB - это поиск символа(AL) в строке(ES:DI). Если есть дубликат, то записываешь нуль в DI-1.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Cумма одинаковых отрицательных элементов массива SilentPerson Помощь студентам 0 08.05.2017 01:06
[Pascal]: Задача о поиске одинаковых элементов в одномерном массиве чисел. IIo3uTuB Помощь студентам 1 15.12.2016 14:13
Дан целочисленный массив размера N, содержащий ровно два одинаковых элемента. Найти номера одинаковых элементов и вывести эти номе Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2011 22:07
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27
поиск одинаковых элементов одномерного массива и их количества MyQwErTy Помощь студентам 2 28.02.2009 17:17