Assembler - sortowanie bąbelkowe

0

Witam, czy ktoś mógłby mi sprawdzić poprawność poniższego kodu?
Miałem napisać program sortujący bąbelkowo tablice według poniższego algorytmu:

  1. Start.
  2. index = 0; zamiany = 0;
  3. Odczytaj dwa sasiadujace elementy z tablicy o pozycjach index oraz
    index + 1; jezeli pierwszy z odczytanych elementow jest wiekszy od
    swojego nastepnika, to zamien elementy miejscami oraz zwieksz zamiany.
  4. Zwieksz index o jeden.
  5. Jezeli index < dlugosc_tablicy - 2 to skacz do 3.
  6. Skacz do 2 jezeli zamiany rozne od zera.
  7. Stop.

Program się kompiluje i nie wyskakują żadne błędy, jednak prosiłbym o ocenę kogoś doświadczonego.

                .MODEL  SMALL

;------------ segment danych -------------

Dane            SEGMENT

DL_TABLICY      EQU     0Ch
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h, 15h, 09h, 11h, 08h, 0Ah, 00h  
         
Dane            ENDS

;------------ segment kodu --------------

Kod             SEGMENT
                ASSUME   CS:Kod, DS:Dane, SS:Stosik

				; zaladowanie rejestru segmentowego danych
start:          mov     ax, SEG Dane
                mov     ds, ax 

                xor     ax, ax ; czyścimy rejestr ax
				mov     cx, DL_TABLICY ; przesyłamy do rejetru cx długość tablicy
				
petla0:         mov     bx, OFFSET Tablica ; przesyłamy do rejestru bx adres początku tablicy (index=0) 
				xor		dx,dx ; czyścimy rejestr dx (zamiany=0)
				
petla1:         mov     ax, [bx] ; do rejestru ax wczytujemy WARTOŚĆ danego elementu tablicy
                cmp     ax, [bx+1] ; porównujemy z elementym następnym czyli [bx+1]
                jbe     nastepny ; jeśli [bx] jest mniejsze niż [bx+1] do skacz do następny
                xchg    ax, [bx+1] ;jeśli nie to zamieniamy te elementy
                mov     [bx], ax 
                inc		dx ;zwiększamy zamiany o 1

nastepny:       inc    bx ;zwiększamy index o 1
		        push   cx
				sub	cx,2
                cmp	bx,cx ;porównujemy index i dlugosc_tablicy - 2 				
				jb	 petla1 ;gdy mniejsze skacz do petla1
				pop  cx
				
                cmp     dx, 0 ;porównaj dx(zamiany) i zero
                ja      petla0 ;jeśli dx(zamiany) większe od zera to skacz do petla0
				loop    petla0

;------------ zakończenie programu --------
                
				mov     ax, 4C00h
                int     21h
Kod             ENDS

;------------ segment stosu ---------------

Stosik          SEGMENT STACK
                DB      100h DUP (?)
Stosik          ENDS

                END     Start
0

Wymysl i napisz testy jednostkowe do tego - w C lub ASM:

http://blog.code-cop.org/2015/08/how-to-unit-test-assembly.html

0

temat do usunięcia

1 użytkowników online, w tym zalogowanych: 0, gości: 1