1

我正在开发一个使用冒泡排序的程序,以便按降序对定义的数组进行排序。在停止之前,我的代码似乎循环了 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       
4

1 回答 1

0

第一的:

你有:

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
...

第二:

您测试avs. b(via 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循环计数器。试试我的建议。

于 2019-10-14T00:59:23.023 回答