1

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

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

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

Vreset              equ       $FFFE
RAM                 equ       $800
ROM                 equ       $100

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

我想从给定数组中获取两个最高值。我的意思是,我想创建一个数组,给出 10 个值(存储在一个数组中),最后获得两个最高值:

例子:

该数组可能包含以下值:

5 7 9 96 57 58 1 5 6 9

我想获得这个输出:

96 58

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

4

1 回答 1

2

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

正式来说,它是生命的终结。但是,由于势头强劲,许多人仍在积极使用它,要么通过加载在 FPGA 中的 IP 等效物,要么通过 Tekmos 等公司的克隆。

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

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

Vreset              equ       $FFFE
ROM                 equ       $100

                    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
于 2020-06-07T20:33:58.220 回答