68hc11 组装(第一步)- 排序

68hc11 assembly (first steps) - sorting

我刚刚爱上了这个特别的微控制器,68hc11 有一个惊人的架构。

我不是专家,但我想改进,组装有点难,但我想给这个微控制器编程。

此汇编代码将从 $100 开始执行,将在 $800 处分配一个 200 字节的数组,并使用值 200、199、... 1 初始化该数组。(降序)。

Vreset              equ       $FFFE
RAM                 equ       0
ROM                 equ       0

ARRAY_SIZE          equ       200

                    org       RAM

array               rmb       ARRAY_SIZE

                    org       ROM

Start               ldx       #array
                    ldaa      #ARRAY_SIZE
Loop                staa      ,x
                    inx
                    deca
                    bne       Loop

                    bra       *

                    org       Vreset
                    dw        Start

I want to get the two highest values from a given array.. i mean, i want to create an array, give 10 values (stored inside an array) and finally obtain the two highest values:

示例:

数组可能包含这些值:

5 7 9 96 57 58 1 5 6 9

我想获得这个输出:

96 58

可以帮我做这个吗?我有点迷路了:/

68HC11 是一种经典的 MCU 架构,曾经(在某种程度上可能仍然)在许多大学教授。

正式来说,它已经停产了。但是,由于势头强劲,许多人仍在积极使用它,要么通过加载到 FPGA 中的 IP 等价物,要么通过 Tekmos 等公司的克隆。

要创建数组,请使用与您展示的类似的代码。我的示例在 ROM 中使用常量数组。

关于您找到两个最高值的问题,有很多可能的解决方案。这只是一个帮助您入门的方法:

Vreset              equ       $FFFE
ROM                 equ       0

                    org       ROM

array               fcb       5,7,9,96,57,58,1,5,6,9
;ARRAY_SIZE         equ       *-array

Start               ldx       #array              ;X -> array
                    ldaa      ,x                  ;let A keep the 1st maximum (assume 1st element)
                    clrb                          ;let B keep the 2nd maximum (assume zero)
Loop                inx                           ;X -> next array element
                    cpx       #array+::array      ;(ASM11 idiom, ::array = 10 i.e., number of elements)
;                   cpx       #array+ARRAY_SIZE   ;(alternative for most assemblers)
                    bhs       Done                ;if past the array end, done

                    cmpa      ,x                  ;compare with current array element
                    bhi       DoB                 ;if already 1st maximum, skip
                    tab                           ;update 2nd maximum with previous 1st
                    ldaa      ,x                  ;else A = new maximum
                    bra       Cont
;                   bra       Loop                ;(optimization of previous line)

DoB                 cmpb      ,x
                    bhi       Cont                ;if already 2nd maximum, skip
;                   bhi       Loop                ;(optimization of previous line)
                    ldab      ,x                  ;else B = new maximum <= A

Cont                bra       Loop                ;repeat for all array elements

Done                bra       *                   ;A = 1st maximum, B = 2nd maximum <= A

                    org       Vreset
                    dw        Start