0

我正在尝试学习 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
4

1 回答 1

3

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

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

顺便说一句,您的代码表明您对某些指令有一些基本的缺乏理解。例如,BLO 50如果累加器低于 50,则不表示分支。这意味着检查应该已由先前的某些指令设置的适当 CCR(条件代码寄存器)标志,如果值小于目标。要将寄存器与某个值或某个内存位置进行比较,您必须使用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 中的 aCLRA清除了进位,因此顺序CLRAADCA错误的。替换为正确的:LDAA,ADCA #0

于 2016-02-29T13:55:30.627 回答