【问题标题】:68hc11 assembly (first steps) - sorting68hc11 组装(第一步)- 分拣
【发布时间】:2020-06-06 21:21:18
【问题描述】:

我刚刚爱上了这个特殊的微控制器,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

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

【问题讨论】:

  • 你能用 C 做吗?目前尚不清楚您是否需要一种算法或已经有一种算法,或者是否需要一些特定汇编指令的帮助,或者将 for 循环或 if 语句转换为汇编。
  • 嘿,埃里克,感谢您的回复!你的意思是?。我根本不喜欢“C”
  • 好的,你能用任何编程语言解决这个问题,包括伪代码吗?换句话说,你有算法吗?
  • 哦,是的。我可以用 Java 或 C# 来做,但我想用 68hc11 指令用汇编代码编写它。你明白我了吗?
  • 当然,所以请使用您的 Java 解决方案并将其逐行翻译成汇编。如果您遇到困难,请询问您在翻译时遇到问题的具体问题。

标签: assembly 68hc11


【解决方案1】:

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

【讨论】:

  • 实际上,它不是报废,但强烈不推荐用于新设计。
  • 当你找到一个新的 max 元素时,你需要将旧的 max 元素保存为第二个 max 而不是仅仅删除它——实际上,你需要一个 tab 紧跟在 bhi DoB 之后
  • 好收获。谢谢。还有另一个错误。将 B 初始化为第一个值是错误的,因为它可能是最大值。所以,假设无符号值,我初始化为零。
  • 非常感谢您的回复,托尼。我正在查看。 PS:我在自学汇编语言,我的一个朋友告诉我这个MC很棒!
  • @Student_new 是一个例子,我想避免编写数组初始化的代码。不过,您通常会在 RAM 上工作。主代码不变。
猜你喜欢
  • 2012-07-13
  • 2018-05-12
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2016-01-13
  • 2018-04-21
相关资源
最近更新 更多