简单的循环和总和

时间:2016-02-28 22:54:00

标签: loops assembly microcontroller codewarrior 68hc12

我正在尝试学习HCS12汇编语言,但互联网上没有足够的例子。我试过写代码但是没有成功。我被卡住了。这不是绝对的功课。有人可以用HCS12汇编语言写评论吗?我想要代码,因为我真的想逐步阅读它。顺便说一下,有没有其他方法更简单的定义数组?

;The array arr will be located at $1500 and the contents {2, 5, 6, 16, 100, 29, 60}
sum = 0;
for i = 0 : 6
    x = arr[i];
    if( x < 50 )
            sum = sum + x
end

我的尝试:

Entry:

            ;2,5,6,16,100,39,60               
            LDAA #2
            STAA $1500
            LDAA #5
            STAA $1501
            LDAA #6
            STAA $1502
            LDAA #16
            STAA $1503
            LDAA #100
            STAA $1504
            LDAA #39
            STAA $1505
            LDAA #60
            STAA $1506

            CLRA  ; 0 in accumulator A
            CLRB  ; 0 in accumulator B
            ADDB COUNT ; B accumulator has 6

loop:       

            ;LDAA 1, X+ ; 1500 should be x because it should increase up to 0 from 6
                        ; A accumulator has 2 now
            BLO 50; number less than 50
            ;ADDA 


            DECB
            BNE loop

1 个答案:

答案 0 :(得分:3)

以下是实现特定FOR循环的一种可能方法。

主要用于HC11,它与HCS12的源级兼容,因此它也应该为HCS12正确组装。然而,HCS12具有一些额外的指令和寻址模式(例如,索引自动增量),这可以使代码更短并且甚至更可读。无论如何,我实际上没有尝试过,但它应该没问题。

顺便说一下,你的代码显示你对某些指令有一些基本的缺乏理解。例如,如果累加器低于50, BLO 50 并不意味着分支。这意味着检查应该已经由某些先前指令设置的相应CCR(条件代码寄存器)标志,并转移到如果值小于目标,则地址50(显然,不是您的意图)。要将寄存器与值或某个内存位置进行比较,您必须使用CMPx指令(例如CMPA)。

;The array arr will be located at $1500 and the contents {2, 5, 6, 16, 100, 29, 60}

                    org       $1500               ;(somewhere in ROM)
arr                 fcb       2,5,6,16,100,29,60  ;as bytes (use dw if words)

                    org       $100                ;wherever your RAM is
;sum = 0;
sum                 rmb       2                   ;16-bit sum

                    org       $8000               ;wherever you ROM is
;for i = 0 : 6
                    clrb                          ;B is your loop counter (i)
                    stb       sum                 ;initialize sum to zero (MSB)
                    stb       sum+1               ;         -//-          (LSB)
ForLoop             cmpb      #6                  ;compare against terminating value
                    bhi       ForEnd              ;if above, exit FOR loop
;    x = arr[i];
                    ldx       #arr                ;register X now points to array
                    abx                           ;add offset to array element (byte size assumed)
                    ldaa      ,x                  ;A is your target variable (x)
;;;;;;;;;;;;;;;;;;; ldaa      b,x                 ;HCS12 only version (for the above two HC11-compatible lines)
                    inx                           ;X points to next value for next iteration
;;;;;;;;;;;;;;;;;;; ldaa      1,x+                ;HCS12 only version (for the above two HC11-compatible lines)
;    if( x < 50 )
                    cmpa      #50
                    bhs       EndIf
;            sum = sum + x
                    adda      sum+1
                    staa      sum+1
                    ldaa      sum
                    adca      #0
                    staa      sum
EndIf
                    incb                          ;(implied i = i + 1 at end of loop)
                    bra       ForLoop
;end
ForEnd

以上假设您的数组是常量,因此它在汇编时放在ROM中的某个位置。如果您的阵列是动态的,它应该位于RAM中,您需要使用代码加载它(类似于您的方式)。但是,为了提高效率,通常在将多个值从一个位置加载(复制)到另一个位置时使用循环。在所需的代码存储器方面,这更具可读性和效率。

希望这有帮助。

已编辑:忘记将SUM初始化为零。

已编辑:与HC08不同,HC11中的CLRA会清除进位,因此序列CLRAADCA错误。替换为正确的:LDAAADCA #0