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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2011, 14:16   #1
Стас_с
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 22
По умолчанию удаление эл из массива

сейчас надо разобраться с удалением элементов, а в инете не могу исходников найти и чтобы посмотреть что к чему .

можете помочь с исходниками программы, ну или показать как удалять эл.
заранее спасибо )
Стас_с вне форума Ответить с цитированием
Старый 03.08.2011, 14:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

самый простой ("классический") способ удаления элемента массива,
это переписать все последующие элементы на место удаляемого, затем размер (количество) элементов в массиве уменьшить на единицу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.08.2011, 20:24   #3
Стас_с
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 22
По умолчанию

есть код?
хочу посмотреть .
Стас_с вне форума Ответить с цитированием
Старый 05.08.2011, 17:54   #4
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию Исходный код смещения.

Код:
.386
.model flat, stdcall
option casemap : none

.data
deleted dd 4; Удаляем четвертый элемент
array dd 1,2,3,4,5,6,7,8,9; Сам массив

.code
start:
xor eax, eax	; Обнуление на всякий пожарный
mov ecx, 9		; Цикл будет повторятся
sub ecx, deleted; 9-4=5 раз
lea esi, array	; Связываем адрем массива с esi
add esi, 4*3	; Начинаем с четвертого элемента
@1:
mov eax, [esi+4]	; Тут происходит
mov [esi], eax		; смещение
add esi, 4
loop @1

mov [esi], dword ptr 0; Поскольку на конце две девятки, до
					  ; удаляем последнюю
ret	
end start
Эта программа удаляет четвёртый элемент из массива.
Т.е. было:
1, 2, 3, 4, 5, 6, 7, 8, 9
Стало:
1, 2, 3, 5, 6, 7, 8, 9, 9
И под конец удаляется последняя девятка (для наглядности).
Ibanez Wizard вне форума Ответить с цитированием
Старый 05.08.2011, 19:57   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А можно и я свои пять коп.
Это код шринковки массива - удаления из него элементов равных чему-то:
Код:
format PE console
entry start
 
include 'D:\fasmw16726\INCLUDE\win32a.inc'
 
section '.data' data readable writeable

массив dd 1,2,6,4,5,6,7,6,9; Сам массив
УдаляемыйЭлемент dd 6

section '.code' code readable executable
start:
 mov ecx,9  ;У нас 9 элементов
 mov esi,массив ; НАчнем с начала
 mov edi,esi    ; А это точка погрешности
a:
 mov eax,[edi] ; Возьмем элемент
 cmp eax,[УдаляемыйЭлемент] ; Если он равен  тому-то
 je next ;То точку погрешности не увеличиваем
 add edi,4
next:
 add esi,4
  mov eax,[esi] ;Чтоб затереть этот элемент следующим за ним
  mov [edi],eax
 loop a;
ret
Правда здесь не подтираются эти удаленные элементы, так что конец массива придется смещать, но это уже на усмотрение автора
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2011, 20:47   #6
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А можно и я свои пять коп.
Это код шринковки массива - удаления из него элементов равных чему-то:
Код:
format PE console
entry start
 
include 'D:\fasmw16726\INCLUDE\win32a.inc'
 
section '.data' data readable writeable

массив dd 1,2,6,4,5,6,7,6,9; Сам массив
УдаляемыйЭлемент dd 6

section '.code' code readable executable
start:
 mov ecx,9  ;У нас 9 элементов
 mov esi,массив ; НАчнем с начала
 mov edi,esi    ; А это точка погрешности
a:
 mov eax,[edi] ; Возьмем элемент
 cmp eax,[УдаляемыйЭлемент] ; Если он равен  тому-то
 je next ;То точку погрешности не увеличиваем
 add edi,4
next:
 add esi,4
  mov eax,[esi] ;Чтоб затереть этот элемент следующим за ним
  mov [edi],eax
 loop a;
ret
Правда здесь не подтираются эти удаленные элементы, так что конец массива придется смещать, но это уже на усмотрение автора

На сколько я знаю, это так же можно организовать с помощью команды scas.
Ibanez Wizard вне форума Ответить с цитированием
Старый 05.08.2011, 20:53   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
На сколько я знаю, это так же можно организовать с помощью команды scas.
Да думаю можно, но лично я не представляю схемы с использованием этой команды. Тоесть я не оч. верю что код будет короче. Если не сложно покажи, мне интересно тоже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2011, 23:53   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Код:
del_byte equ 8
.data
mass	db 1,2,3,8,4,5,6,7,8,9,8,8,3,1,5,57,8,3,76,3,5,5,8,8
.code
start:
	mov edi,offset mass
	mov ecx,sizeof mass
	mov esi,edi
	mov ebx,offset RecFind
	lea edx,[ebx+(offset _call-offset RecFind)]
	@@:
	call ebx
	jecxz @f
	jmp @b
	@@:
	ret

RecFind:		
	jecxz @f
	lodsb
	dec ecx
	jz @f
	.if al==del_byte
		call ebx
		_call:
	.endif
	@@:
	.if [esp]!=edx
		stosb
	.endif
ret
Нет, ну правда..

Последний раз редактировалось yuran666666; 06.08.2011 в 09:58.
yuran666666 вне форума Ответить с цитированием
Старый 06.08.2011, 01:57   #9
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
Подмигивание

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да думаю можно, но лично я не представляю схемы с использованием этой команды. Тоесть я не оч. верю что код будет короче. Если не сложно покажи, мне интересно тоже.
Я тоже не верю что код будет короче. Для этого сам попробовал написать и убедился в этом Вот что у меня получилось:

Код:
.386
.model flat, stdcall
option casemap : none

.data
n dd 4
array dd 1,2,3,4,5,4,7,8,4

.code
start:
	xor eax, eax
	push 9
	pop ecx
	lea edi, array
	mov eax, n
@1:
	scasd
	jz delete
	loop @1
	ret
delete:
	@2:
	mov ebx, [edi]
	mov [edi-4], ebx
	add edi, 4
	loop @2
	mov [edi-4], dword ptr 0
	jmp start
end start
Тут в массиве ищется четверка, и если находится - то удаляется из массива.

Последний раз редактировалось Ibanez Wizard; 06.08.2011 в 02:15.
Ibanez Wizard вне форума Ответить с цитированием
Старый 06.08.2011, 10:13   #10
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Ibanez Wizard, недурно, кстати

Код:
.data
n dd 4
array dd 1,2,3,4,4,5,4,7,8,4
.code
start:
	next:
		push sizeof array/4
		pop ecx
		mov edi,offset array
		mov eax, n
		repnz scasd
		jecxz end_array
			xor eax, eax
			mov esi,edi
			sub edi,4
			rep	movsd
			stosd
	jmp next
	end_array:
	ret
end start
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление из массива С++ zhenya.ya Помощь студентам 6 24.03.2011 23:54
Удаление из массива Цветик Общие вопросы C/C++ 0 07.11.2010 20:34
Удаление из массива Цветик Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.10.2010 03:55
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21