почему мой цикл останавливается на 3, и сообщает о неправильном порядке - PullRequest
1 голос
/ 14 октября 2019

Я работаю над программой, которая использует пузырьковую сортировку для сортировки определенного массива в порядке убывания. Мой код, кажется, циклически повторяется 3 раза, что также приводит к неправильному результату перед остановкой. Это на ассемблере HCS12.

RAMStart    EQU  $0800
ROMStart    EQU  $4000 
N           EQU  8

 ; absolute address to place my code/constant data

; variable/data section

            ORG RAMStart
 ; Insert here your data definition.
Samples   DC.B  $12,$CD,$0F,$3E,$E6,$1B,$F6,$9B


; code section
            ORG   ROMStart


Entry:
_Startup:




; code section
            ORG   ROMStart

loop

             ldx #N-1
             leay x

loop2
              lds #Samples
              tfr y,b
              tfr x,a
              sba
              exg a,b
              ldab sp
              addb #1
              ldaa b,sp
              cba 
              movb 0,sp , y
              staa 0,sp
              dbne y,loop2
            RTS       

1 Ответ

0 голосов
/ 14 октября 2019

Первый:

У вас есть:

ldab sp      ; load byte into b where sp points (e.g. Samples[0]=0x12)
addb #1      ; add 1 to b  !-(   b goes from 0x12 to 0x13
ldaa b,sp    ; load byte into a where b+sp points (Samples[0x13]=???)!!
cba          ; compare b&a

То, что вы хотите сделать вместо этого, выглядит примерно так:

...
ldab sp        ; load byte into b where sp points (e.g. Samples[0]=0x12)
ldaa 1,sp      ; load byte into a where sp+1 points (e.g. Samples[1]=0xCD)
cba            ; compare b&a
...

Second:

Вы проверяете a против b (через cba), но ничего не делаете с результатом сравнения. После cba вам нужно условно перейти вокруг кода подкачки - пропустите два хранилища, которые выполняют подкачку. От того, как вы пропустите, зависит, будет ли сортировка увеличиваться или уменьшаться.


В-третьих:

Обмен, который вы хотите сделать, заключается в сохранении b, куда пришло aиз (в вышеупомянутом) и магазине a, откуда b пришло из (в вышеупомянутом).

У вас есть:

 movb 0,sp , y
 staa 0,sp

И я думаюВы хотите что-то более похожее (заказ для этого не важен):

staa sp        ; store a where b came from
stab 1,sp      ; store b where a came from

Четвертый:

Вы зацикливаетесь достаточно - о чем свидетельствует тот факт, что метка loopникогда не упоминается инструкцией условного перехода. Итак, этот код неполон.


почему мой цикл останавливается на 3

Не уверен, но похоже, что ваш код подкачки стирается yСчетчик цикла. Попробуйте мои предложения.

...