Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
stas9In
2 / 2 / 0
Регистрация: 18.11.2010
Сообщений: 3
#1

Удалить элементы массива, имеющие одинаковые значения - Assembler

18.11.2010, 15:54. Просмотров 2786. Ответов 9
Метки нет (Все метки)

Помогите дописать программу, я составил примерно, но плохо в этом всем понимаю.

Удалить элементы массива А(I) имеющие одинаковые значения. I=1,2,..,10, Определить количество оставшихся элементов.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
masm
model small
.stack 256
.data
len equ 10
n db 1,2,3,4,5,6,7,8,9,10
.code
start:   
    mov ax, @data        
    mov ds, ax
    mov count, 10
    xor si, di
    jcxz    exit
cikle1:
    xor ax, ax
    cmp n[si], n[di]
    je 
    jmp m
    
cikle2:
    inc si
    cmp si, di
    jne cikle1
    jmp exit
    
m:
    mov di, si
perem:
    mov bh, n[di+1]
    mov n[di], bh
    inc di
    mov cx, di
    inc cl
    cmp cl, count
    jne perem
    dec count
    dec si
    mov dl, count
    mov di, dx
    mov n[di], 0
    jmp cikle2
    
exit:
    mov     ax, 4c00h        
    int     21h     
 
end start
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2010, 15:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удалить элементы массива, имеющие одинаковые значения (Assembler):

Удалить из строки слова, имеющие определенную букву - Assembler
Удалить из строки слова, имеющие определенную букву, например D. Строка задана сразу. Подскажите пожалуйста как решить эту задачу

Удалить элементы массива между минимальным и максимальным - Assembler
Добрый день, в задании нужно удалить элементы массива, между минимумом и максимумом, но как удалять, я без понятия, нашел только...

В массиве удалить элементы, меньшие среднего арифметического элементов массива - Assembler
"В массиве удалить элементы, меньшие среднего арифметического элементов массива." Надо написать самым простым способом

Удалить из массива все элементы нечетным номерами(1,3,,,).Условный оператор не использовать - Assembler
Дан целочисленный массив размера N(>2).Удалить из массива все элементы нечетным номерами(1,3,,,).Условный оператор не использовать.

Из массива удалить все нулевые элементы, кроме первого нулевого элемента - Assembler
Помогите сделать задание : Из массива удалить все нулевые элементы, кроме первого нулевого элемента. Все что у меня получилось,...

Удалить из массива все элементы, которые встречаются больше двух раз - Assembler
Дан целочисленный массив размера N. Удалить из массива все элементы, которые встречаются больше двух раз. Помогите пожалуйста!

9
Mikl___
Автор FAQ
11329 / 5872 / 524
Регистрация: 11.11.2010
Сообщений: 10,912
19.11.2010, 10:55 #2
stas9In, твоя задача решается в три этапа
1) Поиск повторяющихся элементов. Берем первый элемент массива и последовательно сравниваем его с остальными элементами. Если находим совпадающий, то заменяем его значение на 0FFh. Потом берем второй элемент массива и так до тех пор пока не проверим все элементы, а повторяющиеся значения не заменим на 0FFh
2) Удаление повторяющихся элементов. Все элементы со значением равным 0FFh сдвинем в конец массива. Ищем элемент равный 0FFh, если у элемента справа значение не равно 0FFh, тогда обмениваем их значения, если произошел обмен делаем регистр BX=1 проходим всю строку до последнего элемента. Если был хоть один обмен, тогда возвращаемся в начало массива, если BX=0 значит все элементы стоят на своих местах.
3) Запоминаем в SI адрес начала массива. Ищем первый элемент со значением 0FFh его адрес равен DI-1. количество элементов с неповторяющимися значениями равно DI - SI - 1
Всё! А вот код
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.286
.model tiny
.code
start:
; ищем повторяющиеся элементы и заменяем их на 0FFh
    mov cx,lenth+1
    mov bx,offset array 
a2: push cx
    mov al,[bx]
    cmp al,0FFh
    je a1
    mov di,bx
    inc di
a0: repne scasb
    jcxz a1
    mov byte ptr [edi-1],0FFh
    loop a0
a1: inc bx
    pop cx
    loop a2
; ищем элемены отличающиеся от 0FFh и сдвигаем их в начало массива
; таким образом происходит удаление из массива повторяющихся элементов
    mov al,0FFh
a5: xor bx,bx
        mov cx,lenth
    mov di,offset array 
a4:     repne scasb
        jcxz a3
    cmp al,[di]
    je a4
    xchg al,[di]
    xchg al,[di-1]
        mov bl,1
        jmp a4
a3: cmp bx,1
    jz a5
; ищем первый элемент с кодом 0FFh, отнимаем от его адреса адрес начала 
;массива, таким образом мы определяем количество оставшихся элементов.
        mov cx,lenth
    mov di,offset array 
    mov si,di
    repne scasb
    sub di,si
    dec di
    ret
array db 1,2,1,1,4,2,7,4,1,10
lenth = $ - array
end start;конец программы
2
stas9In
2 / 2 / 0
Регистрация: 18.11.2010
Сообщений: 3
20.11.2010, 11:04  [ТС] #3
Спасибо большое, но у меня при компиляции выдает ошибку
Undefided symbol: EDI
в строчке mov byte ptr [edi-1],0FFh
1
Mikl___
Автор FAQ
11329 / 5872 / 524
Регистрация: 11.11.2010
Сообщений: 10,912
22.11.2010, 03:24 #4
stas9In, замени edi на di
2
tahir_
159 / 100 / 25
Регистрация: 18.05.2015
Сообщений: 474
20.04.2016, 20:10 #5
Mikl___, нашел выход за пределы массива,
посмотри на cx после a0, когда находим элемент
0
R71MT
4150 / 1038 / 254
Регистрация: 29.07.2014
Сообщений: 2,048
Записей в блоге: 4
21.04.2016, 07:59 #6
Цитата Сообщение от stas9In Посмотреть сообщение
Удалить элементы массива А(I) имеющие одинаковые значения.
В дополнение к варианту Mikl___, можно отсортировать массив, и удалить одинаковые элементы.
В этом случаем задачка решится в 2 прохода..
0
Mikl___
Автор FAQ
11329 / 5872 / 524
Регистрация: 11.11.2010
Сообщений: 10,912
21.04.2016, 09:38 #7
Цитата Сообщение от tahir_ Посмотреть сообщение
нашел выход за пределы массива
tahir_,
я и не думал, что пост созданный в 2010 году кому-то понадобится...
0
R71MT
4150 / 1038 / 254
Регистрация: 29.07.2014
Сообщений: 2,048
Записей в блоге: 4
21.04.2016, 10:28 #8
..и я чтот внимания не обратил. Походу Vikenty все карты спутал..
0
tahir_
159 / 100 / 25
Регистрация: 18.05.2015
Сообщений: 474
21.04.2016, 11:59 #9
Mikl___, R71MT, ко мне обратился товарищ из соц. сетей, типа у меня есть пример но он не работает, и один в один этот, вспомнил и написал
1
Mikl___
21.04.2016, 13:05     Удалить элементы массива, имеющие одинаковые значения
  #10

Не по теме:

tahir_,
я рад, что фрагменты моих программ цитируют в соцсетях

0
21.04.2016, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 13:05
Привет! Вот еще темы с ответами:

Удалить из одномерного массива все элементы, которые встречаются больше двух раз - Assembler
Дан целочисленный массив размера N. Удалить из массива все элементы, которые встречаются больше двух раз. Вопрос1: это значит что массив...

Заменить все нулевые элементы (кроме первого элемента массива) на значения предыдущего элемента - Assembler
есть программа каторая делает : В массиве A заменить все нулевые элементы (кроме первого элемента массива) на значения предыдущего...

Посчитайте, сколько элементов с одинаковым номером будут иметь одинаковые значения - Assembler
3. Сравните соответствующие элементы двух массивов. Посчитайте, сколько элементов с одинаковым номером будут иметь одинаковые значения.

Удалить из массива все элементы, имеющие максимальный значения - Turbo Pascal
Дан одномерный массив целых чисел, требуется удалить из него все элементы, имеющие максимальный значения, при этом сжав массив на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru