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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2009, 19:36   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Усовершенствованный пузырек

Необходимо на ассемблере написать сортировку улученным пузырьком. Помогите, как можно доработать обычный пузырек
Код:
сортировка методом пузырька
	lea bx,arr
	xor si,si
      mov cx,4
cyc1:
      push cx
	xor si,si
      mov di,2
      mov cx,5
      dec cx
cyc2:
	mov ax,word ptr [bx+si]
     	mov dx,word ptr [bx+di]
      cmp ax,dx
      jle _end_if
      mov word ptr  [bx+si],dx
      mov word ptr  [bx+di],ax
_end_if:
      add si,2
      add di,2
      loop cyc2

      pop cx
      loop cyc1
      
;==================================================================
;вывод
	mov cx,5
     	xor si,si
     	xor ax,ax
     	xor dx,dx
outp:
 	call output
	loop outp	 
	ret
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 26.12.2009, 21:02   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

я написала, только где-то видимо косяк, посмотрите пожалуйста
Код:
.model tiny
.code
org 100h
main: 
;============================================================================
	mov cx,5
	xor si,si
ios:
	call input
	mov  word ptr arr[si],ax
	add si,2
	loop ios
;==========================================================================
;улучшенный пузырек
	mov bx,offset arr
cyc0:
	mov ax,l
	cmp ax,r
	jae exit
	mov cx,r
	mov ax,l
	inc ax
	sub cx,ax
	mov si,10
cyc1:
	mov ax,word ptr[si-2]
	cmp word ptr bx[si],ax
	jae no1
	mov dx,word ptr bx[si]
	mov word ptr bx[si-2],dx
	mov word ptr bx[si],ax
	mov k,si
no1:
	sub si,2
	loop cyc1
	mov ax,k
	mov l,ax
	mov ax,r
	dec ax
	add l,ax
	mov cx,l
	mov ax,l
	add ax,2
	mov si,ax
cyc2:
	mov ax,word ptr bx[si+2]
	cmp word ptr bx[si],ax
	jle no2
	mov dx,word ptr bx[si]
	mov word ptr bx[si+2],dx
	mov word ptr bx[si],ax
	mov k,si
no2:
	add si,2
	loop cyc2
	mov ax,k
	mov r,ax
	jmp cyc0
exit:
	

;==================================================================
;вывод
endsort:
	mov cx,5
     	xor si,si
     	xor ax,ax
     	xor dx,dx
outp:
 	call output
	loop outp	 
	ret

;========================================================================
;процедура ввода	
input proc near
	xor ax,ax
	xor dx,dx
	xor bx,bx
	xor di,di
	push cx
	push si
	mov ah,0ah
	mov dx,offset buff ; адрес буфера
	int 21h 
	
;перевести строку
	mov dl,0ah
	mov ah,02;
	int 21h 
	
; обрабатываем содержимое буфера
	mov si,offset buff+2 ;адрес начала строки
start:
	cmp byte ptr[si]," "
	je _prop
	cmp byte ptr [si],"-" ; если первый символ минус
	jnz _poloz	;в противном случае перейти на обработку положительных
	mov di,1  ; устанавливаем флаг

_prop:
	inc si    ; переходим на следующее
	
_poloz:
	xor ax,ax
	mov bx,10  ; основание системы счисления
_perevod:
	mov cl,[si] ; берем символ из буфера
	cmp cl,0dh  ; проверям равен ли символ переводу строки
	jz _endin	;перейти на конец обработки
	
; если символ не последний, то проверяем его на правильность
	cmp cl,30h  ; если введен неверный символ <0
    	jl _err	
    	cmp cl,39h  ; если введен неверный символ >9
    	ja _err

	sub cl,30h ; делаем из символа число 
	mul bx     ; умножаем на 10
	jc _err
	add ax,cx  ; прибавляем к остальным
	jc _err
	inc si     ; переходим на следующее число

	cmp di,1
	je srav_32768
	cmp ax,32767
	ja _err
	jmp _perevod	; повторяем
srav_32768:
	cmp ax,32768
	ja _err	
	
	jmp _perevod	; повторяем



; если была ошибка, то выводим сообщение об этом и выходим
_err:
	mov dx, offset error
	mov ah,09
	int 21h
	int 20h

; все символы из буфера обработаны число находится в ax
_endin:
	
	cmp di,1 ; если установлен флаг, то
	jnz _endp
	neg ax   ; делаем число отрицательным
	
_endp:
;возвращаем значения регистров
	pop si
	pop	cx	
	ret
endp input

;====================================================================
;процедура вывода
output proc near
	push cx
	mov ax, word ptr  arr [si]
;; Проверяем число на знак.
        test    ax, ax
        jns     @oi1

;; Если оно отрицательное, выведем минус и оставим его модуль.
	  push ax
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop ax
        neg ax
        
;; Количество цифр будем держать в CX.
@oi1:  
        xor     cx, cx
        mov     bx, 10
@oi2:   
       ;cwd
       xor dx,dx
       div bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    ax, ax
        jnz     @oi2
; Теперь приступим к выводу.
        mov     ah, 02h
@oi3:   pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    @oi3
		
     	add si,2    
     	pop cx
	mov dx," "
	mov ah,02h
	int 21h
	ret
endp output

arr dw 5 dup(?)
error db "Введено не число$"
buff	db 255,255 dup(?)
l dw 1
r dw 10
k dw ?

end main
Алгоритм брала отсюда:http://forum.antichat.ru/printthread.php?t=84743
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 26.12.2009 в 21:05.
Sparky вне форума Ответить с цитированием
Старый 26.12.2009, 23:41   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Если честно не очень охота смотреть в отладчике сей код, но на глаз увидел в тексте
Код:
	mov si,10
cyc1:
	mov ax,word ptr[si-2]
	cmp word ptr bx[si],ax
явно что-то не то или я что-то не понял. Да и комментарии, наверно, не помешают.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка слов(Пузырек) chipset Общие вопросы C/C++ 2 11.02.2008 08:58