首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >68hc11程序集(第一步)-排序

68hc11程序集(第一步)-排序
EN

Stack Overflow用户
提问于 2020-06-06 21:21:18
回答 1查看 200关注 0票数 1

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

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

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

代码语言:javascript
复制
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个值(存储在一个数组中),最后获得两个最高的值:

示例:

数组可能包含以下值:

代码语言:javascript
复制
5 7 9 96 57 58 1 5 6 9

我想获得以下成果:

代码语言:javascript
复制
96 58

能帮我做这个吗?我有点迷路了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-07 20:33:58

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

从官方意义上说,这是终身制。但是,由于势头的影响,许多人仍然在积极地使用它,要么是通过在FPGA中加载的IP等价物,要么是来自Tekmos等公司的克隆。

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

至于你的问题,找到两个最高的价值,有许多可能的解决办法。这里有一个可以让你开始:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62238168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档