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

特定の配列から 2 つの最大値を取得したい.つまり、配列を作成し、10 個の値 (配列内に格納) を指定して、最終的に 2 つの最大値を取得したい:

例:

配列には次の値が含まれる場合があります。

5 7 9 96 57 58 1 5 6 9

この出力を取得したいと思います:

96 58

これを行うのを手伝ってもらえますか? 私はちょっと迷っています:/

4

1 に答える 1

2

68HC11 は、多くの大学で教えられていた (そしておそらく今でもある程度教えられている) 古典的な MCU アーキテクチャです。

正式には、これはサポート終了です。しかし、勢いのために、FPGA にロードされた IP 同等物、または Tekmos などの企業からのクローンのいずれかによって、多くの人々がまだ積極的に使用しています。

配列を作成するには、示したものと同様のコードを使用します。私の例では、ROM の定数配列を使用しています。

2つの最高値を見つける質問に関しては、多くの可能な解決策があります。以下は、開始するための 1 つのみです。

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 に答える