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

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

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

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

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

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

дело пустяковое но туплю жестоко )
хочу написать уже и смыться отдыхать по быстрому.
и так дело вот в чём, дан массив Х сформировать из него массив У упорядочив элементы по возрастанию .

я написал сортировку, но не сформировал массив У, вот в этом и прошу помочь.


вот код
Код:
stack   segment         STACK
        db      64 dup(?)
stack   ends
data    segment
        x   dw 1, -2, 7, -3, 2, 9, 1, 2, 3 	;исходный массив
		y   dw 9 dup(?)
		n   dw 9
		sad dw ?
		sap dw ?
data    ends
code    SEGMENT
assume ss:stack,ds:data,cs:code
start   proc    far
;--------------Возврат в dos
        push    ds
        sub     ax,ax
        push    ax
;--Занесение в регистр ds адреса сегмента данных
        mov     ax,data
        mov     ds,ax
;--------------Начало программы
        lea bx,x
		lea dx,y
		mov cx,n
c1:
        push cx
        xor si,si  ; обнуляем индекс текущего элемента
        mov di,2
        mov cx,n
        
c2:
        mov ax,[bx+si]  ; берем элемент
        mov dx,[bx+di]  ; и следующий за ним
        cmp ax,dx  ; сравниваем их
        jle _end_if  ; если первый больше или равен второму, то не меняем их . От этого зависит направление
        mov [bx+si],dx  ; обмен элементов
        mov [bx+di],ax
_end_if:
        add si,2  ; указатели на следующие элемент
        add di,2
        loop c2 ; повторяем внутренний цикл
 
        pop cx
        loop c1  ; повторяем внешний цикл

st_ret: ret
start   endp
code    ends
        end     start
заранее спасибо.
Стас_с вне форума Ответить с цитированием
Старый 02.08.2011, 12:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так в начале программы перепишите все элементы из массива X в массив Y (один цикл).
Потом
lea bx, Y
потом ваш код сортировки без изменений
всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2011, 12:58   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

подразумевается, видимо, что Х трогать нельзя. Значит, перед сортировкой просто копируем X в Y:

Код:
cld
mov  es, ds
mov  cx, n
lea  si, x
lea  di, y
rep movsw
а потом сортируем Y тем кодом, который уже есть
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 02.08.2011 в 13:16.
veniside вне форума Ответить с цитированием
Старый 02.08.2011, 13:04   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от veniside
Код:
xor si,si  ; обнуляем индекс текущего элемента
mov di,2
значит 0 + 1 = 2? Так ты не скоро на отдых попадёшь )
veniside, если я не ошибаюсь, то в si заносится смещение первого элемента (нулевое),
а в di - смещение второго элемента. Т.к. массив из DW, то смещение второго элемента равно двум. Не вижу здесь ошибки!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2011, 13:05   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Т.к. массив из DW
угу, я тормознул. Код верный.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.08.2011, 13:21   #6
Стас_с
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 22
По умолчанию

спасибо за подсказку , сделал )
Стас_с вне форума Ответить с цитированием
Старый 02.08.2011, 13:38   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Стас_с
команда lea bx,x лишняя
Код:
        mov ax,x[si]  ; берем элемент
        cmp ax,x[di]  ; и следующий за ним сравниваем их
        jle _end_if  ; если первый больше или равен второму, то не меняем их . От этого зависит направление
        xchg x[di],ax  ; обмен элементов
        mov x[si],ax
Mikl___ вне форума Ответить с цитированием
Старый 09.08.2011, 07:05   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

и даже еще проще
Код:
        mov ax,x[si]  ; берем элемент
        cmp ax,x[si+2]  ; и следующий за ним сравниваем их
        jle _end_if  ; если первый больше или равен второму, то не меняем их
        xchg x[si+2],ax  ; обмен элементов
        mov x[si],ax
_end_if:
        add si,2  ; указатели на следующие элемент
        loop c2 ; повторяем внутренний цикл
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод из БД по сортировке Andruhin PHP 15 14.02.2011 20:39
Вопрос по сортировке многомерного массива monbaln PHP 3 06.09.2010 22:59
О сортировке массивов в C++ Frame1992 Помощь студентам 6 28.10.2009 16:50
Вопрос по сортировке и отчет из таблиц Ruschel БД в Delphi 6 24.10.2009 20:15
Вопрос по сортировке Ermiss БД в Delphi 5 17.02.2008 17:32